来自以下脚本:
EmpID:Name:Designation:UnitName:Location:DateofJoining:Salary
1001:Thomson:SE:IVS:Mumbai:10-Feb-1999:60000
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1003:Jackson:DM:IMS:Hyderabad:23-Apr-1985:90000
1004:BobGL::ETA:Mumbai:05-Jan-2004:55000
1005:Alice:PA:::26-Aug-2014:25000
1006:LilySE::IVS:Bangalore:17-Dec-2015:40000
1007:Kirsten:PM:IMS:Mumbai:26-Aug-2014:45000
1004:BobGL::ETA:Mumbai:05-Jan-2021:55000
我想获取空格数(以 '::' 表示)。非常感谢您的支持。
假设您想要计算冒号分隔的 CSV 文件中空字段的数量,我们可以使用Miller (
mlr
)进行操作,如下所示:由于 Miller 支持 CSV,因此它也能正确处理包含嵌入冒号的字段。例如,以下 CSV 有两个空字段(
Designation
和Salary
):你可以链接一些标准实用程序:
编辑:感谢@Kusalananda 提醒我们
grep -c
使用grep | wc -l
或使用
awk
:也就是说,只要输入字段不包含任何LF或:字符。
您想要一个纯 bash 解决方案吗?
awk 示例,它是 POSIX!
或者
重击:
这里有一个
sed
和wc
实现,以及一个纯bash
实现,以及调用两者的示例代码。我推荐前者。您的输入格式暗示但您没有指定的一件事是,行首和行末可能会有空白条目。sedwc 实现通过在每行的开头和结尾添加一个额外的冒号来处理这些空白。如果这些空白不应计算在内,您可以删除文本
s/^/:/;s/$/:/;
。我认为值得解释一下其
sed wc
实现方式:wc
然后输出总行数、总字数和总字符数。这可解释为:总记录数、包含任何空白的记录数以及总记录数加总空白数。然后进行一些简单的数学运算,输出总空白数。使用Raku(以前称为 Perl_6)
Raku 是 Perl 家族中的一种编程语言,如果您处理 Unicode/UTF-8 文件,它是一个不错的选择。
上面我们在命令行中使用类似 awk 的
-ne
非自动打印逐行标志调用 Raku。我们BEGIN
通过声明一个计数器变量来实现$i
。为了确保正确计数相邻的冒号,我们使用:overlap
修饰符 (named-argument)。示例输入:
示例输出:
6
如果您想查看匹配项,只需添加一个
say
调用,++$
并=>
提供行号:https://raku.org