Você pode querer olhar para os aplicativos uniq
e sort
.
./yourscript.ksh | classificar | uniq
(Para sua informação, sim, a classificação é necessária nesta linha de comando, uniq
apenas retira as linhas duplicadas imediatamente após a outra)
EDITAR:
Ao contrário do que foi postado por Aaron Digulla em relação às uniq
opções de linha de comando:
Dada a seguinte entrada:
classe
jarra
jarra
jarra
bin
bin
Java
uniq
produzirá todas as linhas exatamente uma vez:
classe
jarra
bin
Java
uniq -d
produzirá todas as linhas que aparecerem mais de uma vez e as imprimirá uma vez:
jarra
bin
uniq -u
produzirá todas as linhas que aparecerem exatamente uma vez e as imprimirá uma vez:
classe
Java
sort
possui uma-u
versão para fornecer valores únicos.uniq
costuras processam apenas linhas adjacentes (pelo menos por padrão), o que significa que se podesort
inserir antes da alimentaçãouniq
.É o mesmo que a resposta do monóxido , mas um pouco mais concisa.
fonte
... | sort | uniq
uma vez que é realizada em um único tiroPara conjuntos de dados maiores em que a classificação pode não ser desejável, você também pode usar o seguinte script perl:
Basicamente, isso apenas lembra todas as saídas de linha, para que não sejam exibidas novamente.
Tem a vantagem sobre a
sort | uniq
solução " ", pois não há necessidade de classificação antecipada.fonte
Com o zsh, você pode fazer isso:
Ou você pode usar o AWK:
fonte
awk
solução muito inteligente, porém enigmática (consulte stackoverflow.com/a/21200722/45375 para obter uma explicação) funcionará com arquivos grandes, desde que o número de linhas exclusivas seja pequeno o suficiente (pois as linhas exclusivas são mantidas na memória ) Azsh
solução lê o arquivo inteiro primeiro na memória, o que pode não ser uma opção para arquivos grandes. Além disso, conforme escrito, apenas as linhas sem espaços incorporados são tratadas corretamente; Para corrigir isso, use emIFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}
vez disso.(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
[@]
sufixo para referenciar todos os elementos de uma matriz - parece que - pelo menos a partir da versão 5 - funciona sem ela; ou você acabou de adicioná-lo para maior clareza?print -l "${(fu)$(<infile)}"
awk
saída de amostra.Conduza-os através de
sort
euniq
. Isso remove todas as duplicatas.uniq -d
fornece apenas as duplicatas,uniq -u
fornece apenas as únicas (retira as duplicatas).fonte
uniq -u
não é o comportamento padrão (consulte a edição em minha resposta para mais detalhes)Com o AWK você pode fazer, acho mais rápido que o tipo
fonte
Exclusivo, conforme solicitado, (mas não classificado);
usa menos recursos do sistema para menos de ~ 70 elementos (conforme testado com o tempo);
escrito para receber a entrada de stdin,
(ou modificar e incluir em outro script):
(Bash)
fonte
Recebo dicas melhores para obter entradas não duplicadas em um arquivo
fonte