Sortowanie & uniq w powłoce Linuksa
Jaka jest różnica między poniższymi poleceniami?
sort -u FILE
sort FILE | uniq
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).
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.
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.
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
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
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
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