¿Cómo imprimir solo los valores duplicados de un archivo de texto?

70

Supongamos que hay una columna de valores numéricos como la siguiente:

Archivo1:

1 
2
3
3
3
4
4
4
5
6

Quiero la salida:

3  
4

Es decir, solo las líneas repetidas. ¿Hay alguna herramienta de línea de comandos para descubrir esto en Linux? (Nota: los valores están ordenados numéricamente).

Mente monstruo
fuente
3
Ver man uniq.
jasonwryan
Relacionados, más difícil pregunta: Borrar las líneas duplicadas por parejas
Comodín

Respuestas:

119

Puedes usar uniq(1)para esto:

uniq -d file.txt

Esto imprimirá solo los duplicados. El archivo de entrada debe ordenarse de modo que todos los duplicados sean consecutivos (lo que parecen ser), así que ejecútelo primero si no es así.

camh
fuente
1
¿Qué pasa si quiero que solo se impriman los triplicados?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'para triplicados; reemplace "3" con cualquier N para N-plicates
full.stack.ex
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'para triplicados
@camh, ¿puedes hacer esto también en archivos csv? solo valores de una determinada columna?
NumenorForLife
1
ordenar archivo.txt | uniq -d
ron
1

Usando uniqy awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
fuente
66
Este trabajo, pero no veo por qué canaliza la salida de cat?
Bernhard
1
no todos saben que puedes hacer uniq -c File1y de manera similar con muchas otras herramientas. Eso es probablemente lo que está pasando aquí.
Matthias
1

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

Sanjay Nair
fuente
Da 3\n3\n4\n\4npara la entrada File1 que obviamente está mal.
yaegashi
el recorte de Perl que me encuentro revisando proporciona el número de incidencias de cada línea para que pueda canalizarse, clasificarse y filtrarse según sea necesario: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = each% a) {printf "% d \ t% s", $ v, $ k}} 'nombre de archivo
Theophrastus
¿Hay alguna manera de hacerlo en una columna específica separada por un separador de campo dado?
Geremia
Según lo indicado por yaegashi, se necesita una pequeña solución para cumplir con los requisitos: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt Entre todas las respuestas, es mi favorita, porque las otras respuestas requiere preprocesar todos los datos con una ordenación completa. Esta respuesta inicia los resultados de salida de manera más rápida y eficiente.
BOC
0

uniq requiere que se ordene su lista, ordene los valores predeterminados alfabéticamente

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

o

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

jasonleonhard
fuente