Encuentra líneas únicas


90

¿Cómo puedo encontrar las líneas únicas y eliminar todos los duplicados de un archivo? Mi archivo de entrada es

1
1
2
3
5
5
7
7

Me gustaría que el resultado fuera:

2
3

sort file | uniqno hará el trabajo. Mostrará todos los valores 1 vez


17
El archivo debe ordenarse primero. sort file | uniq -usaldrá a la consola para usted.
ma77c

Creo que la razón por la que se sort file | uniqmuestran todos los valores 1 vez es porque imprime inmediatamente la línea que encuentra la primera vez, y para los encuentros posteriores, simplemente los omite.
Reeshabh Ranjan

Respuestas:



28

Úselo de la siguiente manera:

sort < filea | uniq > fileb

2
Esto no es correcto, creo que quiso decir:uniq -u filea > fileb
Chris Seymour

1
Copio sus datos y corro y funciona: sort<filea.txt | uniq>fileb.txt. Quizás dejaste fuera las extensiones. Estoy usando Mac OS X. tienes que ir de filea.txta otrofileb.txt
kasavbere

No hay necesidad de la redirección con sorty cuál es el punto de la canalización uniqcuando puede hacer sort -u file -o filelo que está haciendo es eliminar los valores duplicados, es decir, su filebcontiene, 1,2,3,5,7el OP solo quiere las líneas únicas que 2,3se logran y se logra mediante la uniq -u fileextensión de archivo no tiene nada con eso, tu respuesta es incorrecta.
Chris Seymour

12

También puede imprimir el valor único en "archivo" utilizando el catcomando mediante la conexión sortyuniq

cat file | sort | uniq -u


9

uniq -u me ha estado volviendo loco porque no funcionó.

Entonces, en lugar de eso, si tiene Python (la mayoría de las distribuciones y servidores de Linux ya lo tienen):

Suponiendo que tiene el archivo de datos en notUnique.txt

#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.

uniqueData = []
fileData = open('notUnique.txt').read().split('\n')

for i in fileData:
  if i.strip()!='':
    uniqueData.append(i)

print uniqueData

###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))

Tenga en cuenta que debido a las líneas vacías, el conjunto final puede contener '' o cadenas de solo espacio. Puedes eliminar eso más tarde. O simplemente salga con la suya copiando desde la terminal;)

#

Solo para su información, desde la página de manual de uniq:

"Nota: 'uniq' no detecta líneas repetidas a menos que sean adyacentes. Es posible que desee ordenar la entrada primero o usar 'sort -u' sin 'uniq'. Además, las comparaciones respetan las reglas especificadas por 'LC_COLLATE'".

Una de las formas correctas, para invocar con: # sort nonUnique.txt | uniq

Ejecución de ejemplo:

$ cat x
3
1
2
2
2
3
1
3

$ uniq x
3
1
2
3
1
3

$ uniq -u x
3
1
3
1
3

$ sort x | uniq
1
2
3

Los espacios pueden estar impresos, ¡así que prepárate!


3
Esto es exagerado.
SmallChess

9

Si bien sorttoma O (n log (n)) tiempo, prefiero usar

awk '!seen[$0]++'

awk '!seen[$0]++'es una abreviatura de awk '!seen[$0]++ {print}', print line (= $ 0) si seen[$0]no es cero. Se necesita más espacio pero solo O (n) tiempo.


7

puedes usar:

sort data.txt| uniq -u

esto ordena los datos y filtra por valores únicos



3

uniqdebería funcionar bien si su archivo está / puede ser ordenado, si no puede ordenar el archivo por alguna razón, puede usar awk:

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'


3
sort -d "file name" | uniq -u

esto funcionó para mí para uno similar. Use esto si no está arreglado. Puede eliminar el orden si está organizado


3

Encuentro esto más fácil.

sort -u input_filename > output_filename

-u significa único.


0

Esta fue la primera que intenté

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

Después de hacer un cat -e all.sorted

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

Cada segunda línea tiene un espacio final :( ¡Después de eliminar todos los espacios finales, funcionó!

gracias

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.