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.