我有一个包含一些值的 tsv 文件。我想要每列的总和以及值和百分比值的总数。例如:
文件.tsv 包含
x 1 1 0 1 x x 1 x
1 1 x 0 0 x 1 x 0
0 0 x 1 1 x 1 1 x
0 x x x 1 x x x 1
(tsv 文件包含超过 4 行)
结果:
x 1 1 0 1 x x 1 x
1 1 x 0 0 x 1 x 0
0 0 x 1 1 x 1 1 x
0 x x x 1 x x x 1
sum 1 2 1 1 3 0 2 2 1
total 3 3 1 3 4 0 2 2 2
percent 33 66 100 33 75 0 100 100 50
我使用 sed 脚本计算了 1 和 0 的数量,但并未将其附加到文件末尾。结果中的 sum 表示列中存在的 '1' 的加法,total 是忽略x
(非数字字符)值的列中 0 和 1 的数量。
答案1
您可以使用 awk 来完成此操作,跟踪数字列与非数字列并在最后进行总结:
#!/usr/bin/awk -f
BEGIN {
width = 0;
}
{
if (width < NF)
width = NF;
for (n = 1; n <= NF; ++n) {
if ( $n ~ /^[0-9]+$/ ) {
number[n] += $n;
total[n] += 1;
} else {
others[n] += $n;
}
}
print;
next;
}
END {
printf "sum";
for (n = 1; n <= width; ++n) {
printf "%5d", number[n];
}
printf "\n";
printf "total";
for (n = 1; n <= width; ++n) {
printf "%5d", total[n];
}
printf "\n";
printf "percent";
for (n = 1; n <= width; ++n) {
if ( total[n] != 0) {
printf "%5d", 100 * number[n] / total[n];
} else {
printf "%5d", 0;
}
}
printf "\n";
}