数値を含むファイルがあります。たとえば、次のようになります。
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
行を合計して結果を列に出力するにはどうすればよいですか?結果は次のとおりです。
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
sed、awk、Perlのソリューションを見たいです。
答え1
Perlソリューション:
perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
-n
入力を1行ずつ読みます。-l
入力から改行文字を削除し、出力に追加します。-a
各入力ラインを余白の @F 配列に分割します。- リスト::ユーティリティこの
sum
機能が提供されるため、数値を直接合計する必要はありません。
sedでは操作はほとんど不可能ですが、sedを使用してスペースをプラス記号に変換し、それをsumのソースとして使用し、bc
結果を入力に貼り付けることができます。
paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)
答え2
データが data.txt というファイルに保存されているとします。
cat data.txt
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
次のように進めますawk
。
awk '{X=$0}{split(X,x)}{print X , x[1]+x[2]+x[3]}' data.txt
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
または@RudiCのコメントによると:
awk '{print $0, $1+$2+$3}' data.txt
答え3
必要な数の列には以下を使用してくださいawk
。
$ awk '{ sum = 0; for (i = 1; i <= NF; i++) sum += $i; $(NF + 1) = sum } 1' <file
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
NF
現在のレコード(デフォルトは行)のフィールド数(デフォルトはスペースで区切られた列)です。sum
計算を繰り返し、合計を設定して最後に$(NF + 1)
新しい列を追加します。この新しい列は、スクリプト1
の末尾の他の列と別々に印刷されますawk
(で置き換えることができます{ print }
)。
sed
どのような算術演算にも適していません。