デジタルテーブルが多いです。以下は単なる例です。
A 25 27 50
B 35 37 75
C 75 78 80
D 99 88 76
さらなる処理のために各テーブルの行と列を合計しようとしているので、出力は次のようになります。
A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281
どうすればいいですか?私は試しましたが、awk
成功しませんでした。
答え1
通常、次のことを行う必要があります。
awk '{ sumrows=0;
for (i=2; i<=NF; i++) {
sumcols[i]+= $i; sumrows+= $i
}; print $0, sumrows+0
}
END { for (x in sumcols)
{ printf SEP sumcols[x]+0; SEP=OFS };
print ""
}' infile
このsumcols[i]+= $i
部分は、同じ列位置のフィールド値を合計しsumrows+= $i
てから、print $0, sumrows
各行を読み取った後に行を印刷します。
そしてEND
ループからスムケルス配列で、printf
断線印刷に使用されます。SEP
デフォルトに設定F生産するS各印刷物の間にスペースを追加するために、2 番目の印刷物から次の印刷物まで使用される区切り記号。
答え2
次のコマンドを試すことができます。
awk '{sum2+=$2; sum3+=$3; sum4+=$4} END {print sum2,sum3,sum4}''{print $0, $2+$3+$4}' file
A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281
答え3
使用幸せ(以前のPerl_6)
~$ raku -e 'my @a = lines; put( $_, .words.skip.sum) for @a; #rowsums \
[Z] @a.map(*.words) andthen .skip.map(*.sum).put; #colsums' file
入力例:
A 25 27 50
B 35 37 75
C 75 78 80
D 99 88 76
出力例:
A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281
最初の;
セミコロンで区切られたステートメントでは、配列は改行を削除するRakuのルーチンautochompsを読み取ることによって@a
生成されます。 2番目のステートメントでは、配列はサフィックス形式を使用して繰り返されます。 topicはトピック変数であり、スペースで区切られた(つまり列)が行単位で構成されていることを示す-medが続き、最初の(文字)列を-pingします。 。 (この行の合計は最後の列と同じです。参考までに、デフォルト値はに示すように1つの行/要素などのパラメータです。)lines
lines
\n
@a
for @a
put
$_
words.skip.sum
words
sum
skip
put
skip
skip(1)
3番目のステートメントでは、配列要素を取り出して結合して@a
配列を並べ替えます。デフォルトでは、これは行と列を置き換えるRの変換関数と同じです。そこで、Rakuの制御語は、最初の要素(文字行)-ped、残りの行-med、および最後の行(列の合計)を使用してテーマ変数を再ロードするために使用されます。[Z]
word
@a
t()
andthen
$_
$_
A B C D
skip
sum
put