我有一个像这样的文件:
$ 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