Pular para o conteúdo
Todos os conceitos

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 -l conta as linhas.
  • sort ordena; sort -u ordena e tira as repetidas.
  • uniq -c junta linhas iguais vizinhas e escreve quantas eram.
  • sort -rn ordena por número (-n), do maior para o menor (-r).
  • head -5 mostra só as 5 primeiras linhas (tail -5, as 5 últimas).
  • cut -d, -f2 pega 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.

roda.txt Ana Bento Ana Carla Ana Bento uniq -c 1 Ana 1 Bento 1 Ana 1 Carla 1 Ana 1 Bento sem sort cada nome conta 1 sort Ana Ana Ana Bento Bento Carla uniq -c 3 Ana 2 Bento 1 Carla com sort antes iguais lado a lado, a contagem sai certa
Sem sort, o uniq -c só junta linhas vizinhas e cada nome conta 1; com sort antes, os nomes iguais ficam juntos e a contagem sai certa: Ana 3, Bento 2, Carla 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).

Aparece nestes desafios