sed、awk、およびPerlを使用して新しい列の行を合計しますか?

sed、awk、およびPerlを使用して新しい列の行を合計しますか?

数値を含むファイルがあります。たとえば、次のようになります。

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どのような算術演算にも適していません。

答え4

純粋なbashソリューションはどうですか?

while read -r a b c; do
    echo $a $b $c $((a+b+c))
done < input

サンプルの実行

関連情報