Группировать по и сумме в сценарии оболочки без awk

У меня есть файл вроде:

$ 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. Пожалуйста, предоставьте альтернативу.

Pure bash , однострочный:

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

Или в более читаемой форме:

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

Результат:

 100,400 201,400 300,600 

Я думаю, что это будет сделано:

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

С помощью 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