我有一个 csv 文件,当读入 shell 时,数据如下:
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
这里要如何计算呢?
顺便说一句,名称不是唯一的,所以我尝试(for 循环)为数组 [net] 创建索引。
我的预期输出是:
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
。