在没有 awk 的 shell 脚本中进行分组和求和

在没有 awk 的 shell 脚本中进行分组和求和

我有一个像这样的文件:

$ cat input.csv
201,100
201,300
300,100
300,500
100,400

我想添加第 2 列中与第 1 列中具有相同值的值。预期输出如下:

$ cat output.csv
201,400
300,600
100,400

我尝试通过awk命令执行此操作,但它在 Solaris 中不起作用。请提供一些替代方案。

答案1

我想这会做:

awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{ for (i in a) print i,a[i]}'

答案2

bash单行:

unset x y sum; while IFS=, read x y; do ((sum[$x]+=y)); done <  input.csv; for i in ${!sum[@]}; do echo $i,${sum[$i]}; done

或者以更易读的形式:

unset x y sum
while IFS=, read x y; do
    ((sum[$x]+=y)); done < input.csv
for i in ${!sum[@]}; do
    echo $i,${sum[$i]}
done

结果:

100,400
201,400
300,600

答案3

这样python就可以更有效地完成工作。默认情况下,该程序期望文件名为“file.txt”,您可以根据需要进行更改。

#!/usr/bin/env python3

col1, col2 = [ list(y) for y in zip(*[ x.strip().split(',') for x in open('file.txt').readlines() if x != '\n' ]) ]

for (offset,x) in enumerate(list(col1)):
    value = 0
    while col1.count(x) > 1:
        index = col1.index(x)
        col1.pop(index)
        value =  int(col2.pop(index))

        index = col1.index(x)
        col2[index] = int(col2[index]) + value

for x, y in zip(col1, col2):
    print(x,',',y)

输出:

201 , 400
300 , 600
100 , 400

相关内容