如果第 1 列相同,则对 .csv 文件的第 2 列求和

如果第 1 列相同,则对 .csv 文件的第 2 列求和

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

相关内容