Usando matrizes em awk
Se os campos do arquivo de entrada estiverem separados por um ou mais caracteres de espaço em branco, você não precisará declarar o separador de campo:
awk 'NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.txt
O mesmo código, formatado para a tela:
awk 'NR>1 && NF { league[$1][$4]++ }
END { for ( team in league )
for ( results in league[team] )
print league[team][results],results,team }' teams.txt
Aqui, league[$1][$4]++ conta os números ( $4 , o quarto campo) de ganhos e perdas para cada equipe ( $1 , o primeiro campo) na liga (o arquivo de entrada).
NR>1 significa que awk irá ignorar o cabeçalho (a primeira linha).
Da mesma forma, NF (abreviação de NF>0 ) significa que awk examinará apenas linhas contendo pelo menos um campo. Em outras palavras, NF ignora linhas em branco.
A seção NR>1 && NF examina o arquivo de entrada e cria a matriz. Quando isso for concluído, a seção END imprimirá a matriz.
Se os campos do arquivo de entrada forem separados por vírgula, adicione BEGIN { FS="," ; OFS=" " } para definir os separadores de campo de entrada ( FS ) e de saída ( OFS ):
awk 'BEGIN { FS="," ; OFS=" " } NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.csv
O mesmo código, formatado para a tela:
awk 'BEGIN { FS="," ; OFS=" " }
NR>1 && NF { league[$1][$4]++ }
END { for ( team in league )
for ( results in league[team] )
print league[team][results],results,team }' teams.csv
Saída:
1 Win Knicks
1 Loss Knicks
1 Win Lakers
2 Loss Lakers
1 Win Celtics
Adicione | sort -t " " -k 3 -k 2,2 ao final desse código, para classificar por equipe e depois por resultados por equipe.
Saída ordenada:
1 Win Celtics
1 Loss Knicks
1 Win Knicks
2 Loss Lakers
1 Win Lakers