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
。