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