Trova linee uniche


92

Come posso trovare le linee univoche e rimuovere tutti i duplicati da un file? Il mio file di input è

1
1
2
3
5
5
7
7

Vorrei che il risultato fosse:

2
3

sort file | uniqnon farà il lavoro. Mostrerà tutti i valori 1 volta


17
Il file deve essere prima ordinato. sort file | uniq -uverrà visualizzato nella console per te.
ma77c

Penso che il motivo sort file | uniqmostri tutti i valori 1 volta è perché stampa immediatamente la linea che incontra la prima volta e, per gli incontri successivi, li salta.
Reeshabh Ranjan

Risposte:



28

Usa come segue:

sort < filea | uniq > fileb

2
Questo non è corretto, penso che intendessi:uniq -u filea > fileb
Chris Seymour

1
Copio i dati ed eseguirlo e funziona: sort<filea.txt | uniq>fileb.txt. Forse hai tralasciato le estensioni. Sto usando un Mac OS X. devi passare da filea.txtun altrofileb.txt
kasavbere

Non è necessario il reindirizzamento con sorte qual è il punto di connessione uniqquando puoi semplicemente fare sort -u file -o filequello che stai facendo è rimuovere i valori duplicati cioè il tuo filebcontiene 1,2,3,5,7l'OP vuole solo le linee uniche che è 2,3ed è ottenuto uniq -u filedall'estensione del file non ha nulla con esso, la tua risposta è sbagliata.
Chris Seymour

13

Puoi anche stampare il valore univoco in "file" usando il catcomando collegando sorteuniq

cat file | sort | uniq -u


9

uniq -u mi ha fatto impazzire perché non funzionava.

Quindi, invece di quello, se hai python (la maggior parte delle distribuzioni e dei server Linux lo hanno già):

Supponendo che tu abbia il file di dati in 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'))

Si noti che a causa delle righe vuote, il set finale può contenere "" o stringhe di soli spazi. Puoi rimuoverlo in seguito. O semplicemente farla franca con la copia dal terminale;)

#

FYI, dalla pagina Man di uniq:

"Nota: 'uniq' non rileva le righe ripetute a meno che non siano adiacenti. Potresti voler ordinare prima l'input o usare 'sort -u' senza 'uniq'. Inoltre, i confronti rispettano le regole specificate da 'LC_COLLATE'."

Uno dei modi corretti per invocare con: # sort nonUnique.txt | uniq

Esempio di esecuzione:

$ 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

Gli spazi potrebbero essere stampati, quindi preparati!


3
Questo è eccessivo.
SmallChess

9

Anche se sortrichiede tempo O (n log (n)), preferisco usare

awk '!seen[$0]++'

awk '!seen[$0]++'è un'abbreviazione di awk '!seen[$0]++ {print}', print line (= $ 0) se seen[$0]diverso da zero. Ci vuole più spazio ma solo O (n) tempo.


7

Puoi usare:

sort data.txt| uniq -u

questo ordina i dati e filtra per valori univoci



3

uniqdovrebbe andare bene se il tuo file è / può essere ordinato, se non puoi ordinare il file per qualche motivo puoi usare awk:

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


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

questo ha funzionato per me per uno simile. Usalo se non è organizzato. Puoi rimuovere l'ordinamento se è organizzato


3

Lo trovo più facile.

sort -u input_filename > output_filename

-u sta per unico.


0

Questo è stato il primo che ho provato

skilla:~# uniq -u all.sorted  

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

Dopo aver fatto un gatto -e all.sorted

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

Ogni seconda riga ha uno spazio finale :( Dopo aver rimosso tutti gli spazi finali ha funzionato!

grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.