いくつかの値を含む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";
}