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).


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.


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 }'

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.