数値表の行と列の合計

数値表の行と列の合計

デジタルテーブルが多いです。以下は単なる例です。

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つの行/要素などのパラメータです。)lineslines\n@afor @aput$_words.skip.sumwordssumskipputskipskip(1)

3番目のステートメントでは、配列要素を取り出して結合して@a配列を並べ替えます。デフォルトでは、これは行と列を置き換えるRの変換関数と同じです。そこで、Rakuの制御語は、最初の要素(文字行)-ped、残りの行-med、および最後の行(列の合計)を使用してテーマ変数を再ロードするために使用されます。[Z]word@at()andthen$_$_A B C Dskipsumput

https://raku.org

関連情報