$ awk '{ count[$1,$3]++ } END { for (i in count) { split(i, field, SUBSEP); printf("%s(%d)%s%s\n", field[1], count[i], OFS, field[2]) } }' file
A(1) -07:00
B(2) -05:00
A(2) -06:00
A(1) -05:00
C(3) -06:00
C(1) -05:00
Observe que a saída pode não estar classificada. Passe por sort
, se necessário.
O código armazena a contagem de quantas vezes o primeiro e o terceiro campos da entrada ocorreram juntos como um par, na matriz count
(com o primeiro e o terceiro campos como o índice). No final, fazemos um loop pelos índices da matriz, dividindo-os nos primeiros e terceiros campos originais (como field[1]
e field[2]
, respectivamente) e geramos esses resultados junto com a contagem no formato desejado.
No formato alternativo:
Se o arquivo de entrada usar um único espaço para o separador de campos (caso contrário, use awk '{ print $1,$3 }'
em vez de cut
):
$ cut -d ' ' -f 1,3 file | sort | uniq -c
1 A -05:00
2 A -06:00
1 A -07:00
2 B -05:00
1 C -05:00
3 C -06:00
Para trocar as duas primeiras colunas:
$ cut -d ' ' -f 1,3 file | sort | uniq -c | awk '{ print $2, $1, $3 }'
A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00