Contar os números presentes em cada linha para uma única String usando o shell script

1

Estou usando o script de shell do Unix e tenho um arquivo de entrada com dados como:

3:abc
1:xyz
1:abc
2:def
10:xyz

Minha saída esperada é:

4:abc
11:xyz
2:def

i.e. Encontre uma string única em cada linha após o delimitador e some os números antes disso. Como fazer isso?

    
por user1582625 11.02.2017 / 06:18

2 respostas

3

Aqui está uma solução usando awk . Ele acumula os valores em uma matriz.

awk -F ":" '{count[$2]+=$1} END {for (key in count) print key, count[key]}' awk_data.txt

E aqui está uma versão, usando um script bash :

#!/usr/bin/env bash
declare -A count
while read line; do
    key=${line##*:}
    cnt=${line%%:*}
    count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done

E outra versão bash dos comentários, usando IFS=:

#!/usr/bin/env bash
declare -A count
while IFS=: read -r cnt key; do
    count[$key]=$(($cnt + ${count[$key]=0}))
done < "$1"
for K in "${!count[@]}"; do echo $K ${count[$K]}; done
    
por 11.02.2017 / 06:28
3

Você também pode querer obter um loot no utilitário GNU datamash . Exemplo (table.txt do PO):

$ sort -t: -k 2 table.txt | datamash -t: -g 2 sum 1 collapse 1
abc:4:1,3
def:2:2
xyz:11:10,1
  • O delimitador de campo -t: é:
  • -g 2 group pela segunda coluna (previamente classificada)
  • sum 1 soma os valores correspondentes na coluna 1
  • collapse 1 e também colapsá-los em uma "," lista separada
por 11.02.2017 / 10:19