sort

Sortuje linie pliku tekstowego według różnych kryteriów.

sort to jedno z tych narzędzi Uniksa, które robi dokładnie to, co obiecuje nazwa: porządkuje linie tekstu. Domyślnie sortuje alfabetycznie (leksykograficznie, według bieżącego locale), ale prawdziwa siła tkwi w opcjach — możesz sortować liczbowo, po konkretnej kolumnie, odwrotnie, po rozmiarach plików czy nazwach miesięcy. Czyta z pliku albo ze standardowego wejścia, więc świetnie łączy się w potoki z grep, cut czy awk. Wynik trafia na standardowe wyjście, oryginalny plik zostaje nietknięty.

Składnia i najważniejsze opcje

Podstawowa forma: sort [OPCJE] [PLIK...]

  • -n — sortowanie numeryczne (żeby 10 było za 9, a nie po 1)
  • -r — odwrotna kolejność (malejąco)
  • -u — usuwa duplikaty, zostawia tylko unikalne linie
  • -k POLE — sortuj po konkretnym polu/kolumnie (np. -k2)
  • -t ZNAK — ustaw separator pól (domyślnie białe znaki)
  • -f — ignoruj wielkość liter
  • -h — sortowanie „ludzkich” liczb z jednostkami (2K, 4M, 1G)
  • -c — nie sortuj, tylko sprawdź czy plik jest już posortowany

Przykłady użycia

  • sort nazwiska.txt — sortuje linie alfabetycznie i wypisuje wynik na ekran.
  • sort -u emaile.txt — sortuje i od razu wyrzuca duplikaty (przydatne przy listach mailingowych).
  • sort -t: -k3 -n /etc/passwd — sortuje użytkowników po UID (trzecie pole, separator dwukropek), numerycznie.
  • du -h --max-depth=1 | sort -h — pokazuje katalogi posortowane po rozmiarze, od najmniejszego, z poprawnym rozumieniem K/M/G.
  • sort -rn -k2 wyniki.txt | headtop wyników: sortuje malejąco po drugiej kolumnie liczbowo i pokazuje początek listy.

Częste błędy i pułapki

Klasyk: sort plik.txt > plik.txtnie rób tego. Shell obcina plik do zera zanim sort zdąży go przeczytać, więc zostajesz z pustką. Do zapisu w miejscu użyj sort -o plik.txt plik.txt — to bezpieczne, bo sort obsługuje ten przypadek świadomie.

Druga pułapka to sortowanie liczb bez -n: domyślnie 100 wyląduje przed 9, bo znak „1″ jest wcześniej niż „9″. Zawsze przy liczbach dawaj -n (albo -h przy jednostkach).

Trzecia rzecz: wyniki bywają różne w zależności od LC_ALL/locale — polskie znaki i wielkość liter potrafią zmienić kolejność. Dla powtarzalności ustaw LC_ALL=C sort plik.txt, wtedy dostajesz czyste sortowanie po bajtach. Uważaj też, że -u uznaje linie za równe według użytego klucza, a nie całej linii — z -k potrafi wyciąć więcej, niż myślisz.

Powiązane komendy: uniq (usuwa sąsiednie duplikaty, wymaga wcześniejszego sortowania), comm (porównuje dwa posortowane pliki), cut i awk (wyciąganie kolumn), shuf (odwrotność — losowa kolejność).