计算特定字符的连续重复次数(例如,)

Ame*_*ina 2 sed regular-expression tr

假设我有一个包含以下两行的文件:

foo,bar,,baz,xy
foo,,bar,baz,xy,,
Run Code Online (Sandbox Code Playgroud)

我想计算,,每行中有多少次(两个连续的逗号被任何其他字符包围)。

我的做法至今:我想我能先摆脱一切,但在每一行的任何一对连续的逗号,然后被一个逗号代替这两个逗号,这样我以后可以数得过来。我怎样才能做到这一点?

上面的答案应该是(如果我们用一个逗号代替双逗号,将其他所有内容都扔掉):

,
,,
Run Code Online (Sandbox Code Playgroud)

或者干脆:

1
2
Run Code Online (Sandbox Code Playgroud)

Jos*_* R. 5

用于这项工作的 Perl 单线:

perl -nle 'print s/(^|[^,]),,([^,]|$)/$&/g' your_file
Run Code Online (Sandbox Code Playgroud)

或者,甚至更短,使用awk

 awk -F',,' '{print NF-1}' your_file
Run Code Online (Sandbox Code Playgroud)

awk会认为,,,,是两个事件,,,而perl一个不会在所有指望它。选择适合您的用例的一种。

更新

您的评论来看,您的初衷似乎是计算每行空字段的数量。如果是这种情况,这个 Perl 单行应该有帮助(它假设没有包含逗号的带引号的字段):

perl -nle 'print scalar grep {//} split/,/' your_file
Run Code Online (Sandbox Code Playgroud)

awk如果 Perl 不可用,同样如此:

awk -F, 'empty=0;{for(i=1;i<=NF;i++)if($i=="")empty++};{print empty}' your_file
Run Code Online (Sandbox Code Playgroud)