各行について計算する方法

各行について計算する方法

csvファイルがあり、シェルに読み込むと、データは次のようになります。

name,income,reward,payment
Jackson,10000,2000,1000
Paul,2500,700,200
Louis,5000,100,1800

私は、「純所得=所得+インセンティブ支給」という式を使って、各個人の純所得を探したいと思います。

コマンドを使用してこれを実行すると、データの最初の行のみが計算されます。

$ cat data.csv | awk -F ',' '{for (i=1;i<=NF;i++) net[i] = $2+$3-$4} END {for (p in total) print p, "net = ", net[p]}' > result.txt

ここではどのように計算しますか?

ところで、名前が一意ではないので、配列[net]のインデックスを作成しようとしてforループを試しました。

私の予想結果は次のとおりです。

1 Jackson net = 11000
2 Paul net = 3000
3 Louis net = 3300

答え1

$ awk -F, -v OFS=, 'NR>1 { print $1, $2+$3-$4 }' data.csv 
Jackson,11000
Paul,3000
Louis,3300

または、(更新された)ヘッダー行で既存のデータにネットワークを追加したい場合:

$ awk -F, -v OFS=, 'NR==1 {print $0,"net"}; NR>1 {print $0, $2+$3-$4}' data.csv 
name,income,reward,payment,net
Jackson,10000,2000,1000,11000
Paul,2500,700,200,3000
Louis,5000,100,1800,3300

答え2

この方法:

$ awk 'BEGIN{ FS=OFS="," } { $5=NR>1?$2+$3-$4:"net" }1' infile
name,income,reward,payment,net
Jackson,10000,2000,1000,11000
Paul,2500,700,200,3000
Louis,5000,100,1800,3300

または、期待される出力を更新します。

$ awk -F, 'NR>1{ print NR-1, $1, "net= " $2+$3-$4 }' ifnile
1 Jackson net= 11000
2 Paul net= 3000
3 Louis net= 3300

答え3

使用awk:

awk -F',' '{ p[NR] = $1;net[NR] = $2+$3-$4} END {for (i=2;i<=NR;i++) print (i-1), p[i], "net = ", net[i]}' data.csv

これはcsvファイルなのでFS = ','-F ','

p次に配列を作成しますnet。これはNR(レコード番号)にインデックスされています。

これにより、forループが(i-1), p[i], "net = ", net[i]計画どおりに機能します。 for最初の行がヘッダー行なので、ループは2から始まります。

pipeこの場合、役に立たない。もう一つの点はループは大丈夫ですが、制限がありNRますNF

関連情報