如何计算大于某个值的行并将计数写入 Linux 中的文本文件
How to count rows greater than a value and write the count to a text file in Linux
我有一个示例数据如下所示的文件:
%_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( == 100)print;}
任何人都可以建议一种方法来计算上面指定的列并使用 linux 命令或脚本 (awk) 写入文件。谢谢
Perl 解决方案:
perl -lane '$F[$_] == 100 and $c[$_]++ for 0 .. $#F }{ print $.-1, " @c"' < input
-l
添加换行符到 print
-a
将输入拆分为 @F
数组
- 对于每一行,脚本遍历记录并在看到 100 时向特定计数器加 1
- 文件结束后,将打印计数器,前面是读取的文件数减一(您不计算 header)
awk解决方案:
$ cat chas.awk
NR == 1 { hdr = [=10=]; next }
{
a[1] += ( == 100) ? 1 : 0;
a[2] += ( == 100) ? 1 : 0;
a[3] += ( == 100) ? 1 : 0;
a[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 = [=11=]; 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
}
awk 和 column 的一种方式。
awk 'NR==1{print "TotalRows "[=10=];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 "[=11=];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
我有一个示例数据如下所示的文件:
%_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( == 100)print;}
任何人都可以建议一种方法来计算上面指定的列并使用 linux 命令或脚本 (awk) 写入文件。谢谢
Perl 解决方案:
perl -lane '$F[$_] == 100 and $c[$_]++ for 0 .. $#F }{ print $.-1, " @c"' < input
-l
添加换行符到print
-a
将输入拆分为@F
数组- 对于每一行,脚本遍历记录并在看到 100 时向特定计数器加 1
- 文件结束后,将打印计数器,前面是读取的文件数减一(您不计算 header)
awk解决方案:
$ cat chas.awk
NR == 1 { hdr = [=10=]; next }
{
a[1] += ( == 100) ? 1 : 0;
a[2] += ( == 100) ? 1 : 0;
a[3] += ( == 100) ? 1 : 0;
a[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 = [=11=]; 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
}
awk 和 column 的一种方式。
awk 'NR==1{print "TotalRows "[=10=];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 "[=11=];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