如何计算大于值的行并将计数写入Linux中的文本文件

时间:2015-03-10 14:17:39

标签: linux awk

我有一个包含以下示例数据的文件:

%_above_10 %_above_20 %_above_30 %_above_50
88.6    88.1    87.8    87.2
89.1    78.5    72.3    59.4
100.0   100.0   100.0   100.0
100.0   100.0   100.0   100.0
100.0   100.0   70.0   80.0
100.0   100.0   100.0   80.0
100.0    31.9    26.8    17.4
00.0   96.0    77.3    43.3
68.8    65.9    63.6    57.1

我需要计算每列中值为100的行并将其写入文本文件。输出可能如下所示:

Totalrows %_above_10 %_above_20 %_above_30 %_above_50
   9        5            4          3         2

我可以使用基本的awk命令一次计算一列:

awk -F "\t" '{if($1 == 100)print;}

有没有人可以建议一种方法来计算上述指定方式的列,并使用linux命令或脚本(awk)写入文件。感谢

3 个答案:

答案 0 :(得分:3)

使用awk和列的方法。

awk 'NR==1{print "TotalRows "$0;next}
     {for(i=1;i<=NF;i++)a[i]+=$i==100}
     END{print NR-1,a[1],a[2],a[3],a[4]}' file | column -t

更一般

 awk 'NR==1{print "TotalRows "$0;next} 
      {a[0]++;for(i=1;i<=NF;i++)a[i]+=$i==100}
      END{for(i=0;i<=NF;i++)printf "%s ",a[i];print t}' test | column -t

输出

TotalRows  %_above_10  %_above_20  %_above_30  %_above_50
9          5           4           3           2

答案 1 :(得分:2)

Awk解决方案:

$ cat chas.awk
NR == 1 { hdr = $0; next }    
{
    a[1] += ($1 == 100) ? 1 : 0;
    a[2] += ($2 == 100) ? 1 : 0;
    a[3] += ($3 == 100) ? 1 : 0;
    a[4] += ($4 == 100) ? 1 : 0;
}
END { print "Totalrows", hdr; print (NR-1),a[1],a[2],a[3],a[4] }

$ awk -f chas.awk chas.txt
Totalrows %_above_10 %_above_20 %_above_30 %_above_50
9 5 4 3 2

或者关于列数的更一般的解决方案:

NR == 1 { hdr = $0; cols = NF; next }

{
    for (i=1; i<=NF; ++i) {
      a[i] += ($i == 100) ? 1 : 0;
    }
}

END {
    print "Totalrows", hdr
    printf (NR-1)
    for (i=1; i<=cols; ++i) {
      printf " " a[i]
    }
    print "" # add final newline
}

答案 2 :(得分:0)

Perl解决方案:

perl -lane '$F[$_] == 100 and $c[$_]++ for 0 .. $#F }{ print $.-1, " @c"' < input
  • -lprint
  • 添加换行符
  • -a将输入拆分为@F数组
  • 对于每一行,脚本会遍历记录,并在特定计数器看到100
  • 时添加1
  • 一旦文件结束,打印计数器,前面是读取的文件数减1(你不计算标题)