我有一个包含以下示例数据的文件:
%_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)写入文件。感谢
答案 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
-l
为print
-a
将输入拆分为@F
数组