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。