Como imprimir apenas os valores duplicados de um arquivo de texto?

70

Suponha que exista uma coluna de valores numéricos, como a seguir:

Arquivo1:

1 
2
3
3
3
4
4
4
5
6

Eu quero a saída:

3  
4

Ou seja, apenas as linhas repetidas. Existem ferramentas de linha de comando para descobrir isso no Linux? (Nota: os valores são ordenados numericamente).

MiNdFrEaK
fonte
3
Veja man uniq.
Jasonwryan
Pergunta relacionada e mais difícil: Excluir linhas duplicadas aos pares
Curinga

Respostas:

119

Você pode usar uniq(1)para isso:

uniq -d file.txt

Isso imprimirá apenas as duplicatas. O arquivo de entrada precisa ser classificado de forma que todas as duplicatas sejam consecutivas (o que parecem ser), portanto, execute-o primeiro pela classificação, se não for.

camh
fonte
11
e se eu quiser que as triplicatas sejam impressas apenas?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'para triplicatas; substitua "3" por qualquer N para
plicados
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'for triplicates
@camh, você também pode fazer isso em arquivos CSV? apenas valores de uma determinada coluna?
NumenorForLife
11
classificar arquivo.txt | uniq -d
r
1

Usando uniqe awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
fonte
6
Este trabalho, mas não vejo por que você canaliza a saída cat?
Bernhard
11
nem todo mundo sabe que você pode fazer o uniq -c File1mesmo com muitas outras ferramentas. Provavelmente é o que está acontecendo aqui.
Matthias
1

Execute isto: perl -ne 'print if $a{$_}++' filename.txt

Sanjay Nair
fonte
3\n3\n4\n\4npara a entrada File1 que está obviamente errada.
Yaegashi
o perl snip que estou revisitando fornece o número de incidências de cada linha para que possa ser canalizada, classificada e filtrada conforme necessário: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = cada% a) {printf "% d \ t% s", $ v, $ k}} 'nome do arquivo
Theophrastus
Existe uma maneira de fazer isso em uma coluna específica separada por um determinado separador de campos?
Geremia
Conforme indicado por yaegashi, é necessária uma pequena correção para atender aos requisitos: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt.txt Entre todas as respostas, é o meu favorito, porque as outras respostas requer pré-processamento de todos os dados com uma classificação completa. Esta resposta inicia os resultados de saída com mais rapidez e eficiência.
BOC
0

uniq requer que sua lista seja ordenada, classifique os padrões como alfabéticos

sort | uniq -d path/to/your/filename

ou

cat fileName | sort | uniq -d path/to/your/filename

jasonleonhard
fonte