sort -u file.txt remove as linhas repetidas e ordena o que sobrou; awk '!seen[$0]++' file.txt remove as repetidas e mantém a ordem original. Qual você quer depende de a ordem significar alguma coisa — num log ela sempre significa. O uniq sozinho não faz nem uma coisa nem outra.
1. Por que o uniq sozinho não resolve
$ clai remova as linhas duplicadas do access.log→ uniq access.log10.0.0.710.0.0.310.0.0.710.0.0.910.0.0.310.0.0.710.0.0.1
O arquivo voltou igual. O uniq só junta linhas idênticas vizinhas, e num arquivo real as repetições estão espalhadas. Daí a dupla clássica sort | uniq.
2. Remover duplicatas e ordenar
$ clai remova as duplicatas e ordene o arquivo→ sort -u access.log10.0.0.110.0.0.310.0.0.710.0.0.9
O sort -u faz os dois serviços numa passada — mais curto e mais rápido que canalizar para o uniq.
3. Remover duplicatas mantendo a ordem
$ clai remova as duplicatas mas mantenha a ordem original das linhas→ awk '!seen[$0]++' access.log10.0.0.710.0.0.310.0.0.910.0.0.1
Essa é a diferença real para o sort -u: sobrevive a primeira ocorrência de cada linha e a ordem fica intacta, o que importa em logs e em tudo que é escrito em ordem cronológica. O preço é memória: o awk guarda cada linha distinta, e isso aparece em arquivos de vários gigabytes.
4. Quantas vezes cada linha aparece
$ clai conte quantas vezes cada linha aparece→ sort access.log | uniq -c | sort -rn 3 10.0.0.7 2 10.0.0.3 1 10.0.0.9 1 10.0.0.1
A receita do "top N" para logs. O uniq -c conta e o segundo sort -rn joga as frequentes para cima.
5. Só as linhas que se repetiram
$ clai mostre só as linhas que aparecem mais de uma vez→ sort access.log | uniq -d10.0.0.310.0.0.7
-d mantém só as duplicadas; -u faz o contrário e mantém só as que aparecem uma vez — 10.0.0.1 e 10.0.0.9 neste arquivo. Útil quando você compara duas listas.
6. Deduplicar por um campo
$ clai deixe uma linha por URL→ awk '!seen[$2]++' req.logGET /a 200GET /b 404
$2 é o segundo campo. É assim que se colapsa um log por URL, por IP ou por id de sessão, mantendo inteira a primeira linha correspondente.
Gotchas
sort -u arquivo > arquivoesvazia o arquivo. Verificado: o shell trunca o arquivo para escrita antes de osortsequer ler, e você fica com zero linhas. Usesort -u arquivo -o arquivo— o sort tem uma flag para gravar sobre a própria entrada, e ela funciona.uniqprecisa de entrada ordenada. Sem osortna frente ele devolve quase o mesmo arquivo sem avisar. Não é erro, é resposta errada em silêncio.- Ordem e ordenação são exigências diferentes.
sort -udá ordem alfabética,awk '!seen[$0]++'dá a original. Para logs você quase sempre quer a segunda, e quase todo artigo mostra a primeira.
Related questions
Como acho as linhas em comum entre dois arquivos? comm -12 <(sort a.txt) <(sort b.txt). As duas entradas precisam estar ordenadas, e é para isso que serve a substituição de processos.
Como ignoro maiúsculas e minúsculas? sort -uf compara sem diferenciar; awk '!seen[tolower($0)]++' faz o mesmo mantendo a ordem.
E se o arquivo não couber na memória? O sort -u usa arquivos temporários em disco e engole entradas maiores que a RAM; a versão com awk pode estourar a memória no mesmo arquivo.
See also
- Extrair colunas de CSV com awk
- Localizar e substituir em vários arquivos
- Contar arquivos de um diretório, recursivo e por tipo
O CliAI escolhe entre a versão que ordena e a que preserva a ordem conforme você formula a tarefa, e mostra o comando antes. Instale em uma linha.