Wszędzie widzę kogoś, kto musi uzyskać posortowaną, unikalną listę, do której zawsze przesyła sort | uniq
. Nigdy nie widziałem żadnych przykładów, w których ktoś używa sort -u
zamiast tego. Dlaczego nie? Jaka jest różnica i dlaczego do sortowania lepiej jest używać uniq niż unikalnej flagi?
119
Odpowiedzi:
sort | uniq
istniał wcześniejsort -u
i jest kompatybilny z szerszą gamą systemów, chociaż prawie wszystkie nowoczesne systemy obsługują-u
- to POSIX. Jest to przeważnie powrót do czasów, kiedysort -u
nie istniały (a ludzie nie mają tendencji do zmiany metod, jeśli znany im sposób działa, wystarczy spojrzeć naifconfig
vs.ip
adopcję).Oba zostały prawdopodobnie połączone, ponieważ usuwanie duplikatów w pliku wymaga sortowania (przynajmniej w standardowym przypadku) i jest niezwykle częstym przypadkiem użycia. Jest także szybszy wewnętrznie, ponieważ jest w stanie wykonywać obie operacje jednocześnie (i ponieważ nie wymaga IPC pomiędzy
uniq
isort
). Zwłaszcza jeśli plik jest duży,sort -u
prawdopodobnie użyje mniej plików pośrednich do sortowania danych.W moim systemie konsekwentnie otrzymuję takie wyniki:
To również nie maskować kodu powrotu
sort
, co może być ważne (w nowoczesnych pocisków istnieją sposoby, aby uzyskać to, na przykład,bash
jest$PIPESTATUS
tablicą, ale nie zawsze było to prawdą).źródło
sort | uniq
ponieważ 9 razy na 10, właściwie lecę douniq -c
.sort -u
był częścią 7. edycji UNIX, około 1979 roku. Wersjesort
bez wsparcia dla-u
są naprawdę archaiczne - lub zostały napisane bez zwracania uwagi na faktyczny standard przed standardem de jure POSIX. Zobacz także Stack Overflow Sort & uniq w powłoce Linux z 2010 roku.ip
. Jest rok 2016 i ten post w 2013 roku, ale teraz wiem tylko oip
dowodzeniu.uniq -c
” (a może jeszcze raz przesyłamsort -nr | head
). Zastanawiałem się, co jestsort | uniq
w Vimie, kiedy dowiedziałem się, że Vim ma:sort u
dowodzenie. Isort -u
istnieje również TIL .sort -n | uniq
Vs.sort -n -u
. Na przykład końcowe i białe spacje będą traktowane jako duplikaty,sort -n -u
ale nie przez pierwsze!echo -e 'test \n test' | sort -n -u
zwracatest
, aleecho -e 'test \n test' | sort -n | uniq
zwraca obie linie.Jedną różnicą jest to, że
uniq
ma wiele przydatnych dodatkowych opcji, takich jak pomijanie pól w celu porównania i zliczanie liczby powtórzeń wartości.sort
„s-u
flag realizuje tylko funkcjonalność ozdóbuniq
polecenia.źródło
sort -u
nie można przekazać,uniq
aby użyć niektórych przydatnych opcji tego ostatniego, takich jak pomijanie pól w celu porównania i zliczanie liczby powtórzeń”.W przypadku
sort
s iuniq
s zgodnych z POSIX (GNUuniq
jest obecnie niezgodny w tym względzie), istnieje różnica w tym, żesort
używa algorytmu zestawiania ustawień regionalnych do porównywania ciągów (zwykle używastrcoll()
do porównywania ciągów), podczas gdyuniq
sprawdza tożsamość wartości bajtowej (zwykle używastrcmp()
) .Ma to znaczenie z co najmniej dwóch powodów.
W niektórych lokalizacjach, szczególnie w systemach GNU, istnieją różne znaki, które sortują to samo. Na przykład w ustawieniach narodowych en_US.UTF-8 w systemie GNU wszystkie znaki ①②③④⑤⑥⑦⑧⑨⑩ ... i wiele innych sortują to samo, ponieważ ich kolejność sortowania nie jest zdefiniowana. Cyfry arabskie 0123456789 są sortowane tak samo, jak ich odpowiedniki w języku arabskim wschodnim (٠١٢٣٤٥٦٧٨٩).
Dla
sort -u
① sortuje to samo co ②, a 0123 to samo co ٠١٢٣, więcsort -u
zachowałby tylko jeden z nich, podczas gdy dlauniq
(nie GNU,uniq
który używastrcoll()
(oprócz-i
)), ① różni się od ② i 0123 różni się od ٠١٢٣, więcuniq
rozważa wszystko 4 unikalne.strcoll
może porównywać tylko ciągi prawidłowych znaków (zachowanie jest niezdefiniowane zgodnie z POSIX, gdy dane wejściowe zawierają sekwencje bajtów, które nie tworzą prawidłowych znaków), podczas gdystrcmp()
nie przejmuje się znakami, ponieważ dokonuje tylko porównania bajt-bajt. To kolejny powód, dla któregosort -u
możesz nie podać wszystkich unikalnych wierszy, jeśli niektóre z nich nie tworzą poprawnego tekstu.sort|uniq
, chociaż nadal nie jest określony w przypadku wprowadzania nietekstowego, w praktyce jest bardziej prawdopodobne, że podadzą ci unikalne wiersze z tego powodu.Obok tych subtelności, jedna rzecz, która nie odnotowano do tej pory jest to, że
uniq
porównuje całą linię leksykalnie, podczas gdysort
„s-u
porównano na podstawie specyfikacji danego sortowania w wierszu poleceń.źródło
Wolę używać,
sort | uniq
ponieważ kiedy próbuję użyć opcji-u
(wyeliminuj duplikaty), aby usunąć duplikaty zawierające mieszane ciągi znaków, nie jest łatwo zrozumieć wynik.Uwaga: zanim będziesz mógł uruchomić poniższe przykłady, musisz zasymulować standardową sekwencję zestawiania C, wykonując następujące czynności:
Na przykład, jeśli chcę posortować plik i usunąć duplikaty, zachowując jednocześnie odrębność różnych przypadków ciągów.
To zamieszanie rozwiązuje się, nie wykorzystując
-u
opcji usuwania duplikatów. Korzystanieuniq
jest bardziej przewidywalne. Poniżej najpierw sortuje i ignoruje obudowę, a następnie przekazuje jąuniq
do usunięcia duplikatów.źródło
-u
opcjasort
wyjścia pierwszego równego przebiegu (patrz strona man). W ten sposóbsort -fu
odbiera się pierwsze wystąpienie każdej unikalnej linii bez rozróżniania wielkości liter. Logikasort
używana do usuwania duplikatów jest przewidywalna.Kolejną różnicą, którą dzisiaj odkryłem, jest to, że podczas sortowania w oparciu o delimetr
sort -u
stosuje się unikalną flagę tylko do kolumny, którą sortujesz.źródło