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 | uniq
non farà il lavoro. Mostrerà tutti i valori 1 volta
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 | uniq
non farà il lavoro. Mostrerà tutti i valori 1 volta
sort file | uniq
mostri tutti i valori 1 volta è perché stampa immediatamente la linea che incontra la prima volta e, per gli incontri successivi, li salta.
Risposte:
uniq
ha l'opzione che ti serve:
-u, --unique
only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
Usa come segue:
sort < filea | uniq > fileb
uniq -u filea > fileb
sort<filea.txt | uniq>fileb.txt
. Forse hai tralasciato le estensioni. Sto usando un Mac OS X. devi passare da filea.txt
un altrofileb.txt
sort
e qual è il punto di connessione uniq
quando puoi semplicemente fare sort -u file -o file
quello che stai facendo è rimuovere i valori duplicati cioè il tuo fileb
contiene 1,2,3,5,7
l'OP vuole solo le linee uniche che è 2,3
ed è ottenuto uniq -u file
dall'estensione del file non ha nulla con esso, la tua risposta è sbagliata.
Puoi anche stampare il valore univoco in "file" usando il cat
comando collegando sort
euniq
cat file | sort | uniq -u
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à):
#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'))
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
$ 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
uniq -u < file
farà il lavoro.
uniq
dovrebbe 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}'
sort -d "file name" | uniq -u
questo ha funzionato per me per uno simile. Usalo se non è organizzato. Puoi rimuovere l'ordinamento se è organizzato
Lo trovo più facile.
sort -u input_filename > output_filename
-u
sta per unico.
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
sort file | uniq -u
verrà visualizzato nella console per te.