我想计算一个由几个块组成的文件中的行,比如3,每个块都有不同的行数。每个块由空行分隔。有一线解决方案吗? 到目前为止,我所拥有的是:
awk'(NR> 4)&& NF!= 0 {++ count} END {print count}'filename> OUTFILE
这显然会计算所有非空行(并删除4行标题)。我现在必须包含一个for循环,每次运行后它应该打印行数。
因此,如果我有100个非空行,并且第一个块包含20行,第二个50行和第三个30行,理想输出将是20 50 30
到目前为止,我所有的努力都有语法错误。
感谢您的帮助 汤姆
答案 0 :(得分:1)
awk 'NR>4 {if ($0 ~ /./ ) { mylines=mylines+1 } else { printf("%d ",mylines) ; mylines=0 } }
END { if ($0 ~ /./) { printf("%d ",mylines) } }' <FILENAME>
会这样做。
注意:我正在使用printf
,因为您已将输出指定为“20 50 30”,它位于一行上。
编辑:刚认识到,我们必须跳过前4行。
答案 1 :(得分:0)
如果我告诉你(下次展示例子)
$ cat file
#Surface 0 of 1 surfaces
# Contour 0, label: 0.138
462 370.107 0.137889
461.82 370 0.137889
skipping lines
463 370.529 0.137889
462 370.107 0.137889
570 448.082 0.137889
569.772 448 0.137889
skipping lines
571 448.272 0.137889
570 448.082 0.137889
569 465.332 0.137889
568.299 465 0.137889
skipping lines
570 465.554 0.137889
569 465.332 0.137889
$ awk 'NR==3{ RS=""; FS="\n"}NR>3{print NF}' file
5
5
5
基本上,在达到记录4之前的记录3处,将记录分隔符设置为空白,将字段分隔符设置为换行符。这是因为我们不想触摸标题行的RS和FS变量。在第3行之后,我们需要更改RS和FS,以便获得所需的结果。即,记录以空行结束,所有字段由换行符“\ n”分隔,实质上,计算NF将获得一条记录中的总行数。
答案 2 :(得分:0)
awk 'BEGIN{count=0}\
{ if(NF==0) {if(NR>4)print count;count=0} \
else count++ ;}' test.txt
答案 3 :(得分:0)
以下是我的文件版本: 它以空行开头:
#Surface 0 of 1 surfaces
# Contour 0, label: 0.138
462 370.107 0.137889
461.82 370 0.137889
skipping lines
463 370.529 0.137889
462 370.107 0.137889
570 448.082 0.137889
569.772 448 0.137889
skipping lines
571 448.272 0.137889
570 448.082 0.137889
569 465.332 0.137889
568.299 465 0.137889
skipping lines
570 465.554 0.137889
569 465.332 0.137889
是的,最后有一个空行
THX