Precisa somar a última coluna com base no delimitador de pipe

3

Eu tenho abaixo entradas com grande número de linhas

11|ABCD|19900101123123445455|555|AAA|50505050|0000009030
11|ABCD|19900101123123445455|555|AAA|50505050|0000000199
13|ABCD|201803010YYY66666666|600|ETC|20180300|0000084099
11|ABCD|19900101123123445455|555|AAA|50505050|0008995001

E eu preciso ficar abaixo da saída

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099

Eu tenho tentado com awk abaixo, mas tenho conhecimento muito limitado com matrizes.

cat test|awk -F"|" '{ a[$1]++;b[$2]++;c[$3]++;d[$4]++;e[$5]++;f[$6]+=$6 }; END { for (i in a); print i, f[i]}'

Eu preciso somar a última coluna da coluna 6 e imprimir todas as 5 primeiras colunas, separadas por pipe e a última 6ª coluna como soma da 6ª coluna.

    
por Ganesh 25.03.2018 / 13:44

4 respostas

5

Awk solução:

awk 'BEGIN{ FS=OFS="|" }
     { a[$1 FS $2 FS $3 FS $4 FS $5 FS $6] += $7 }
     END{ for (i in a) print i, a[i] }' file

A saída:

11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|84099
    
por 25.03.2018 / 14:08
9

Com comando GNU datamash :

$ datamash -t'|' -s -g 1,2,3,4,5,6 sum 7 < infile
11|ABCD|19900101123123445455|555|AAA|50505050|9004230
13|ABCD|201803010YYY66666666|600|ETC|20180300|8409

Em datamash v1.2+ , você também pode especificar o intervalo das colunas.

$ datamash -t'|' -s -g 1-6 sum 7 < infile

Ou a alternativa AWK mais curta e onde você tinha colunas N e não deve especificar todas elas uma a uma:

awk -F'|' '{x=$NF;NF--; a[$0]+=x} END{for(i in a) print i, a[i]}' OFS='|' infile
    
por 25.03.2018 / 14:35
4

A ideia é certa, mas para tal requisito você cria a chave hash como os valores, exceto a última coluna, e usa essa chave para somar valores na última coluna. Depois que todas as linhas forem processadas na cláusula END , imprimiremos os valores somados

awk '
     BEGIN {FS=OFS="|"} {
         hashKey = ""
         for(i=1;i<=(NF-1); i++) {
             hashKey = ( hashKey ? (hashKey FS $i):$i )
         }
         total[hashKey]+=$NF
     }
     END { for ( j in total ) print j, total[j] }
' file
    
por 25.03.2018 / 14:03
0

e perl

perl -lne '
    $sum{$1} += $2 if /(.*)\|(.*)/
 } END {
    print "$_|$sum{$_}" for keys %sum
' file
    
por 25.03.2018 / 17:35