Oto polecenia dotyczące losowego pliku z pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Strony podręcznika nie są jasne, co -u
robi flaga. Jakakolwiek rada?
Odpowiedzi:
Krótka wersja:
uniq
, bez-u
, sprawia, że każdy wiersz wyniku jest unikalny.uniq -u
drukuje tylko każdą unikalną linię z wejścia .Nieco dłuższa wersja:
uniq
służy do obsługi plików, które mają zduplikowane linie i tylko wtedy, gdy linie te pojawiają się kolejno na wejściu. Zatem dla swoich celów unikalna linia to taka, która nie jest natychmiast duplikowana.(
uniq
ma bardzo ograniczoną pamięć krótkotrwałą; nigdy nie będzie pamiętał, czy linia pojawiła się wcześniej na wejściu, chyba że była to bezpośrednio poprzednia linia - dlategouniq
bardzo często jest łączonasort
).Gdy napotka szereg powtarzających się wierszy,
uniq
bez-u
argumentu drukuje jedną kopię tego wiersza. (To sprawia, że każdy wiersz wyniku jest unikalny ).Z
-u
argumentem wypisuje zero kopii tego wiersza - serie duplikatów są po prostu pomijane w danych wyjściowych.źródło
sort -u
zamiastsort | uniq
.uniq
zawiera normalizację i zestawianie, tak. Ale nawet wtedy jest to tylko kwestia lokalna - wiesz, gdzie w posortowanym wyjściu pojawi się linia, i po prostu musisz wybrać, którą z kilku sąsiednich linii zachować. Jeśli dane wejściowe nie zostaną posortowane, decyzja wpłynie na całą operację unifikacji, na przykład jeśli zamierzasz zachować ostatni duplikat, nie możesz wyprowadzić niczego, dopóki nie przeczytasz ostatniego wiersza danych wejściowych ...uniq
z-u
pomija wszystkie linie, które mają duplikaty. A zatem:Zwykle
uniq
drukuje wiersze co najwyżej raz (przy założeniu posortowanego wejścia). Ta opcja faktycznie drukuje wiersze, które są naprawdę unikalne (nie pojawiły się ponownie).źródło
uniq
można nazwaćdistinct
, ponieważ drukuje wszystkie odrębne linie, natomiastuniq -u
drukuje wszystkie unikalne linie.uniq
.specyfikacja uniq POSIX wyraźnie to opisała:
-u
opcja powoduje, abyuniq
nie drukować powtarzających się linii.Większość
uniq
implementacji używała porównania bajtów, podczas gdy GNUuniq
stosowało porządek sortowania do filtrowania zduplikowanych linii. Może więc powodować nieprawidłowe wyniki w niektórych lokalizacjach, na przykład wen_US.UTF-8
ustawieniach regionalnych:i nie
-u
dał ci żadnych wierszy:Powinieneś więc ustawić ustawienia regionalne,
C
aby uzyskać porównanie bajtów:źródło
uniq
(choć najwyraźniej intencją POSIX, że powinno to zrobić porównanie bajtów zamiast strcoll () porównanie jak wsort -u
) jako tych lokalizacjach, które błędnie mają ① sortowania taka sama jak ②. Przynajmniej GNUuniq
jest zgodny zsort -u
.uniq
konieczności zrobienia memcmp / strcmp w przeciwieństwie do strcoll, co nie jest dla mnie zbyt oczywiste, ale dotyczyło Geoffa . O tym, że ustawienia narodowe GNU mają ① sortowanie takie same jak ②, jest to oczywiście błąd, ponieważ nie ma powodu, dla którego powinny sortować to samo. Jest to dozwolone przez POSIX, ale nadchodzą pewne zmiany .normalna:
uniq: nie ma dwóch kolejnych powtarzających się wierszy
posortowane
sort -u: nie ma dwóch powtarzających się wierszy
sort / uniq: wszystkie odrębne
liczy różne wystąpienia
tylko wiersze, które się nie powtarzają (nie są najpierw sortowane)
tylko wiersze, które się nie powtarzają (po sortowaniu)
uniq -d: wypisuje tylko zduplikowane linie, po jednej dla każdej grupy
.. policzył
źródło