计算每个文件块的非空行,有几个块用空行分隔

时间:2010-02-12 09:01:52

标签: awk

我想计算一个由几个块组成的文件中的行,比如3,每个块都有不同的行数。每个块由空行分隔。有一线解决方案吗? 到目前为止,我所拥有的是:

awk'(NR> 4)&& NF!= 0 {++ count} END {print count}'filename> OUTFILE

这显然会计算所有非空行(并删除4行标题)。我现在必须包含一个for循环,每次运行后它应该打印行数。

因此,如果我有100个非空行,并且第一个块包含20行,第二个50行和第三个30行,理想输出将是20 50 30

到目前为止,我所有的努力都有语法错误。

感谢您的帮助 汤姆

4 个答案:

答案 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