Agrupe por e soma em shell script sem awk

0

Eu tenho um arquivo como:

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

Eu quero adicionar os valores na coluna 2, que tem o mesmo valor na coluna 1. A saída esperada é a seguinte:

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

Eu tentei fazer isso pelo comando awk , mas ele não está funcionando no Solaris. Por favor, forneça alguma alternativa.

    
por Sunny Monga 21.11.2014 / 12:02

3 respostas

3

Pure bash , uma linha:

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

Ou de uma forma mais legível:

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

O resultado:

100,400
201,400
300,600
    
por 21.11.2014 / 15:35
2

Acho que isso vai funcionar:

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

Com python isso pode ser feito de forma mais eficaz. Este programa, por padrão, espera que o arquivo seja nomeado como 'file.txt', que você pode alterar se necessário.

#!/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)

Saída:

201 , 400
300 , 600
100 , 400
    
por 21.11.2014 / 15:20