Znajdź unikalne linie

90

Jak mogę znaleźć unikalne wiersze i usunąć wszystkie duplikaty z pliku? Mój plik wejściowy to

1
1
2
3
5
5
7
7

Chciałbym, aby wynik był:

2
3

sort file | uniqnie wykona pracy. Pokaże wszystkie wartości 1 raz

amprantino
źródło
17
Plik należy najpierw posortować. sort file | uniq -uwyświetli się na konsoli.
ma77c
Myślę, że powodem sort file | uniqpokazania wszystkich wartości 1 raz jest to, że natychmiast drukuje linię napotkaną za pierwszym razem, a przy kolejnych spotkaniach po prostu je pomija.
Reeshabh Ranjan

Odpowiedzi:

88

uniq ma opcję, której potrzebujesz:

   -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
źródło
32
Upewnij się, że dokonałeś sortowania, jeśli wpisy w pliku nie zostały jeszcze posortowane. sort file.txt | uniq
user3885927
zobacz moją odpowiedź, jeśli nie chcesz najpierw sortować. stackoverflow.com/a/54803217/5441945
hychou
28

Użyj w następujący sposób:

sort < filea | uniq > fileb
kasavbere
źródło
2
To nieprawda, myślę, że miałeś na myśli:uniq -u filea > fileb
Chris Seymour
1
I skopiować dane i uruchomić go i to działa sort<filea.txt | uniq>fileb.txt. Może pominąłeś rozszerzenia. Używam Mac OS X. musisz przejść z filea.txtdo innegofileb.txt
kasavbere
Nie ma potrzeby przekierowywania z sorti jaki jest sens przekierowania do uniqktórego można po prostu zrobić sort -u file -o fileto, co robisz, to usunięcie zduplikowanych wartości, tj. Twój filebzawiera 1,2,3,5,7OP chce tylko unikalnych linii, które są 2,3i są osiągane przez uniq -u filerozszerzenie pliku nie ma nic z tym, twoja odpowiedź jest błędna.
Chris Seymour
12

Można również wydrukować unikalną wartość w „pliku” za pomocą catpolecenia, przesyłając potok do sortiuniq

cat file | sort | uniq -u

Skywardcode
źródło
9

uniq -u doprowadza mnie do szału, ponieważ nie działa.

Więc zamiast tego, jeśli masz Pythona (większość dystrybucji Linuksa i serwerów już go ma):

Zakładając, że masz plik danych w 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'))

Zwróć uwagę, że ze względu na puste wiersze ostateczny zestaw może zawierać ciągi znaków „” lub tylko spacje. Możesz to później usunąć. Lub po prostu uciec od kopiowania z terminala;)

#

Do Twojej wiadomości, ze strony podręcznika uniq:

„Uwaga: 'uniq' nie wykrywa powtarzających się wierszy, chyba że sąsiadują ze sobą. Możesz najpierw posortować dane wejściowe lub użyć 'sort -u' bez 'uniq'. Również porównania są zgodne z regułami określonymi przez 'LC_COLLATE'."

Jeden z poprawnych sposobów wywołania: # sort nonUnique.txt | uniq

Przykładowy bieg:

$ 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

Spacje mogą zostać wydrukowane, więc bądź przygotowany!

popielaty 2
źródło
3
To jest przesada.
SmallChess
9

Chociaż sortzajmuje O (n log (n)) czasu, wolę używać

awk '!seen[$0]++'

awk '!seen[$0]++'to skrót od awk '!seen[$0]++ {print}', print line (= $ 0), jeśli seen[$0]nie jest zerem. Zajmuje więcej miejsca, ale tylko O ​​(n) czasu.

hychou
źródło
7

możesz użyć:

sort data.txt| uniq -u

to sortowanie danych i filtrowanie według unikatowych wartości

czarniejszy
źródło
4

uniq -u < file wykona robotę.

Shiplu Mokaddim
źródło
Nie ma potrzeby przekierowania.
Chris Seymour
Tak, wiem.
Robiłem
3

uniqpowinno wystarczyć, jeśli plik jest / można go posortować, jeśli z jakiegoś powodu nie możesz posortować pliku, możesz użyć awk:

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


źródło
3
sort -d "file name" | uniq -u

to zadziałało dla mnie na podobny. Użyj tego, jeśli nie jest zaaranżowane. Możesz usunąć sortowanie, jeśli jest uporządkowane

a_rookie_seeking_answers
źródło
3

To jest dla mnie łatwiejsze.

sort -u input_filename > output_filename

-u oznacza wyjątkowy.

Anant Mittal
źródło
0

To była pierwsza próba

skilla:~# uniq -u all.sorted  

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

Po zrobieniu kota -e all.sortowane

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

Co druga linia ma końcową spację :( Po usunięciu wszystkich końcowych spacji zadziałało!

Dziękuję Ci

amprantino
źródło