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

amprantino
fuente
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:

88

uniq tiene la opción que necesitas:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
Lev Levitsky
fuente
32
Asegúrese de ordenar si las entradas en el archivo o aún no están ordenadas. ordenar archivo.txt | uniq
user3885927
vea mi respuesta si no quiere ordenar primero. stackoverflow.com/a/54803217/5441945
hychou
28

Úselo de la siguiente manera:

sort < filea | uniq > fileb
kasavbere
fuente
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

skywardcode
fuente
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!

ashmew2
fuente
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.

hychou
fuente
7

puedes usar:

sort data.txt| uniq -u

esto ordena los datos y filtra por valores únicos

mas negro
fuente
4

uniq -u < file hará el trabajo.

Shiplu Mokaddim
fuente
No es necesario el redireccionamiento.
Chris Seymour
Sí, lo sé. Lo hizo habitualmente
Shiplu Mokaddim
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}'


fuente
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

a_rookie_seeking_answers
fuente
3

Encuentro esto más fácil.

sort -u input_filename > output_filename

-u significa único.

Anant Mittal
fuente
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

amprantino
fuente