Pipes, um comando alimenta o outro
A barra vertical liga a saída de um comando à entrada do próximo; com sort, uniq -c e wc você conta qualquer coisa.
Cada comando de texto lê linhas, faz uma coisa só e escreve linhas. A barra vertical | (o pipe, "cano") liga a saída de um comando à entrada do próximo, e comandos pequenos viram uma linha de montagem.
Um exemplo: quem pegou a cuia na roda de chimarrão, uma pessoa por linha, no arquivo roda.txt.
$ cat roda.txt
Ana
Bento
Ana
Carla
Ana
Bento
$ cat roda.txt | wc -l
6
$ cat roda.txt | sort | uniq -c
3 Ana
2 Bento
1 Carla
$ cat roda.txt | sort | uniq -c | sort -rn | head -1
3 Ana
wc -lconta as linhas.sortordena;sort -uordena e tira as repetidas.uniq -cjunta linhas iguais vizinhas e escreve quantas eram.sort -rnordena por número (-n), do maior para o menor (-r).head -5mostra só as 5 primeiras linhas (tail -5, as 5 últimas).cut -d, -f2pega a segunda coluna de um arquivo separado por vírgulas.
O detalhe que mais engana: o uniq só compara cada linha com a de cima. Sem o sort antes, as três Ana ficam separadas e cada uma conta 1.
Mais três sinais aparecem junto com os pipes. O > grava a saída num arquivo (sort roda.txt > ordenada.txt, apagando o que havia nele). O < usa um arquivo como entrada (wc -l < roda.txt). E o * é um curinga que o shell troca pelos nomes que combinam: cat dias/*.csv junta todos os .csv da pasta dias, em ordem alfabética.
Em Python, a contagem inteira é collections.Counter(open("roda.txt").read().split()).most_common(1).