逗号后 5 个连续空行的计数

逗号后 5 个连续空行的计数
day:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
ab1:,P,,P,,,,,,,,,P,P,P,,,,P,P,P,P,,,P,P,P,,P,,

ab2:P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,P,,

ab3:,,,P,,,,,,,,P,P,P,P,P,P,P,P,P,P,P,,,,,,,,,

连续空白计数大于 5,则打印连续空白计数结果:

ab1:8

ab2:0

ab3:7,8

对于 ab3,从第 4 天到第 12 天的日期之间:输出:ab3:7

答案1

呆呆地解决方案:

awk -v FPAT='ab[0-9]+:|,{5,}' 'NR>1 && NF{ 
           r=""; 
           for(i=2;i<=NF;i++) { 
               len=length($i)-1; if(len >= 5) r=(r!="")? r","len : len 
           } 
           printf("%s%s\n", $1, (r!="")? r : 0) 
       }' file

输出:

ab1:8
ab2:0
ab3:7,8

细节

  • -v FPAT='ab[0-9]+:|,{5,}'- 定义字段值的模式

  • for(i=2;i<=NF;i++)- 迭代由逗号序列组成的字段

  • len=length($i)-1- 计算逗号后跟“空”空格的数量

  • r=(r!="")? r","len : len- 累积计数结果

答案2

perl -lne '/^ab/ and print /^(ab\d+:)/, /P,{6,}/ ? join ",", map tr/,//d-1, //g : 0' data

Output:-
ab1:8
ab2:0
ab3:7,8

只会查看以 ab 开头的行

map将对 P 后跟超过 5 个逗号的字段应用转换。 map 的作用是将逗号减去 1,然后将它们传递给 join。

相关内容