如何对每一行进行计算

如何对每一行进行计算

我有一个 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

相关内容