我有一个 csv 文件,其中第 1 列是基因的名称,第 2 列是与该基因相关的值。但是,有些基因有多个值,如果第 1 列的值相同,我想对第 2 列的值求和。
因此,例如如果我有一个test.csv
如下所示的文件:
eee,55
ddd,60
eee,5
aaa,70
aaa,50
ddd,100
fff,30
我希望它返回:
eee,60
ddd,160
aaa,120
fff,30
我尝试使用
awk 'BEGIN { FS = OFS = "," }
NR != 1 { y[$1] += $2; $2 = y[$1]; x[$1] = $0; }
END { for (i in x) { print x[i]; } }'
但我得到的输出是
eee,5
fff,30
aaa,120
ddd,160
为什么它对除 eee 之外的每个值都有效?
答案1
您似乎跳过了一个不存在的 CSV 标头:NR != 1
。如果没有它:
$ awk 'BEGIN { FS = OFS = "," }
{ y[$1] += $2; $2 = y[$1]; x[$1] = $0; }
END { for (i in x) { print x[i]; } }' foo
aaa,120
eee,60
ddd,160
fff,30
答案2
您也可以按照以下方式完成awk
。
awk -F, '{y[$1]+=$2}END{for (x in y) print x","y[x]}' in.txt