Sortowanie & uniq w powłoce Linuksa

Jaka jest różnica między poniższymi poleceniami?

sort -u FILE

sort FILE | uniq
Author: Chris Seymour, 2010-08-01

6 answers

Użycie sort -u robi mniej We / Wy niż sort | uniq, ale efekt końcowy jest taki sam. W szczególności, jeśli plik jest na tyle duży, że {[4] } musi tworzyć pliki pośrednie, istnieje spora szansa, że sort -u użyje nieco mniej lub nieco mniejszych plików pośrednich, ponieważ może wyeliminować duplikaty podczas sortowania każdego zestawu. Jeśli dane są wysoce powielające, może to być korzystne; jeśli w rzeczywistości jest niewiele duplikatów, nie będzie to miało dużej różnicy (zdecydowanie efekt wydajności drugiego rzędu, w porównaniu do efektu pierwszego rzędu rury).

Zauważ, że czasami Orurowanie jest odpowiednie. Na przykład:

sort FILE | uniq -c | sort -n

Sortuje plik według liczby wystąpień każdego wiersza w pliku, przy czym najczęściej powtarzane wiersze pojawiają się jako ostatnie. (Nie dziwi mnie, ¿e ta kombinacja, która jest idiomatyczna dla Uniksa lub POSIX, mo ¿e byæ zgnieciona w jedno z3o ¿onym poleceniem 'sort' z GNU sort.)

Są chwile, kiedy nie używanie rury jest ważne. Na przykład:

sort -u -o FILE FILE

Sortuje plik 'in situ', to znaczy, że plik wyjściowy jest określony przez -o FILE, a operacja ta jest gwarantowana bezpiecznie (plik jest odczytywany przed nadpisaniem dla wyjścia).

 65
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 16:12:59

Jest jedna niewielka różnica: kod zwrotu.

Rzecz w tym, że jeśli shopt -o pipefail nie jest ustawione, kod powrotu polecenia piped będzie kodem powrotu ostatniego. I uniq zawsze zwraca zero (sukces). Spróbuj sprawdzić kod wyjścia, a zobaczysz coś takiego (pipefail nie jest tutaj ustawione):

pavel@lonely ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
pavel@lonely ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0

Inne niż to, polecenia są równoważne.

 10
Author: P Shved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 19:05:34

Uwaga! Chociaż prawdą jest, że "sort-u" I "sort|uniq" są równoważne, wszelkie dodatkowe opcje sortowania mogą złamać równoważność. Oto przykład z podręcznika coreutils:

Na przykład 'sort - n-u' sprawdza tylko wartość początkowego ciągu liczbowego podczas sprawdzania unikalności, podczas gdy' sort-n | uniq ' sprawdza całą linię.

Podobnie, jeśli sortujesz na polach kluczowych, test unikalności używany przez sort nie musi już patrzeć na całą linię. Po ugryziony przez tego błędu w przeszłości, te dni mam tendencję do korzystania z "sort / uniq" podczas pisania skryptów Bash. Wolałbym mieć wyższe koszty We / Wy niż ryzykować, że ktoś inny w sklepie nie będzie wiedział o tej pułapce, gdy zmodyfikuje mój kod, aby dodać dodatkowe parametry sortowania.

 6
Author: willdye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-23 20:36:19

sort -u będzie nieco szybsze, ponieważ nie musi przesyłać wyjścia pomiędzy dwoma poleceniami

Zobacz też moje pytanie w temacie: wywołanie uniq i sortowanie w różnych porządkach w powłoce

 5
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:06

Nic, dadzą ten sam wynik

 2
Author: Jauzsika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 17:09:41

Pracowałem na niektórych serwerach, gdzie sort nie obsługuje opcji '- u'. tam musimy użyć

sort xyz | uniq
 0
Author: Hemant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-15 21:06:05