Sortuj według trzeciej kolumny


131

Mam do czynienia z ogromnym 4-kolumnowym plikiem. Chciałbym wyświetlić posortowany plik w standardzie na podstawie jego trzeciej kolumny:

cat myFile | sort -u -k3

Czy to wystarczy, aby wykonać lewę?


4
Pamiętaj, że możesz to zapisać jako sort -u -k3 < myFile.
gerrit

6
Jak sort -u -k3 myFilenawet
Sebastian Graf,

Odpowiedzi:


166
sort -k 3,3 myFile

wyświetli plik sortowane przez 3 rd kolumnie Zakładając, że kolumny są oddzielone przez sekwencje półwyrobów (SPC i znaków ASCII zakładki w lokalizacji POSIX / C), w zależności od celu sortowania określoną przez bieżącej lokalizacji.

Zauważ, że wiodące spacje są zawarte w kolumnie (domyślny separator to przejście z niepustej na pustą), co może mieć znaczenie w lokalizacjach, w których spacje nie są ignorowane dla celów porównania, użyj -bopcji zignorowania wiodące puste miejsca.

Zauważ, że jest on całkowicie niezależny od powłoki (wszystkie powłoki analizują tę samą linię poleceń, powłoki na ogół nie mają sortwbudowanego polecenia).

-k 3jest sortowanie na części linii począwszy od 3 rd kolumnie (w tym spacjami). W ustawieniach regionalnych C, ponieważ znaki spacji i tabulacji zajmują pierwsze miejsce przed wszystkimi drukowalnymi znakami, co zwykle daje taki sam wynik jak -k 3,3(z wyjątkiem linii, które mają identyczne trzecie pole),

-upolega na zachowaniu tylko jednego wiersza, jeśli istnieje kilka identycznych sortowań (to jest, gdzie klucz sortowania sortuje to samo (niekoniecznie to samo co bycie równym )).

catjest polecenie con cat enate. Nie potrzebujesz tego tutaj.

Jeśli kolumny są oddzielone przez coś innego, potrzebujesz -topcji, aby określić separator.

Podany przykładowy plik a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

Z -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Wiersze 2 i 3 mają tę samą trzecią kolumnę, ale tutaj klucz sortowania znajduje się od trzeciej kolumny do końca wiersza, więc -uzachowuje obie. ␠ca␠dsortuje wcześniej, ␠c␠cponieważ spacje są ignorowane w pierwszym przejściu w moim języku, cadsortuje przed cc.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

Powyżej tylko jeden zachowany jest dla tych, w których znajduje się trzecia kolumna ␠c. Zwróć uwagę, w jaki sposób zachowany jest ten z ␠␠c(2 wiodącymi spacjami).

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Zobacz, w jaki sposób kolejność a b c di a c c csą odwrócone. W pierwszym przypadku, ponieważ ␠c␠csortuje wcześniej ␠c␠d, w drugim przypadku, ponieważ klucz sortowania jest taki sam ( ␠c), porównanie w ostateczności, które porównuje wiersze w pełnych wstawach a b c dprzed a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Po zignorowaniu spacji klucz sortowania dla pierwszych 3 wierszy jest taki sam ( c), więc są sortowane według porównania w ostatniej instancji.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

W ustawieniach regionalnych C ␠␠csortuje się wcześniej, ␠cponieważ istnieje tylko jedno przejście, w którym znaki (następnie pojedyncze bajty) są sortowane na podstawie ich wartości punktu kodowego (gdzie spacja ma niższy punkt kodowy niż c).


kolumny są blankoddzielone, w zależności od ustawień regionalnych mogą zawierać inne znaki oprócz spacji i tabulacji.
jfs

1
Fajnie, +1. Czy możesz wyjaśnić, co to 3,3robi? Dlaczego nie tylko 3?
terdon

@terdon, patrz rozszerzony opis z przykładami.
Stéphane Chazelas,

@JFSebastian, masz rację, odpowiedź zaktualizowana.
Stéphane Chazelas,

Ach, żeby to sortować tylko na 3, a nie na reszcie linii, dzięki.
terdon

4

Jeśli rozumiesz „kolumnę” jak w pliku tekstowym (czwarty znak), to tak, twoje rozwiązanie powinno działać (lub nawet sort -u -k3 myFilepozwolić na sortwykonanie magii oszczędzającej pamięć z losowym dostępem). Jeśli rozumiesz „kolumnę” jak w bazie danych - cały byt danych, po którym następuje separator, i zmienną szerokość kolumny, potrzebujesz czegoś bardziej wyszukanego, np. Sortuje ls -l według rozmiaru

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(co jest równoważne trywialnemu, ls -lSale ładnie służy przykładowi).


5
Nie domyślnie sortowania kolumny są puste oddzielone, to nie są kolumny znaków, aby posortować w kolumnie 3 znaków, składnia będzie: sort -k 1.3,1.3. ls -l | sort -k5,5nsortować według rozmiaru.
Stéphane Chazelas,

awkRozwiązaniem jest dokładnie to, co needed-- ja łatwo modyfikowane, aby dopasować wymagania kompleks sortowania
jchook

2
sort -g -k column_number 

to właściwe polecenie do sortowania dowolnej listy zawierającej znaki numeryczne przy użyciu określonej kolumny


1
Używanie -k zostało już dość dobrze omówione, więc byłoby pomocne, gdybyś wyjaśnił, w jaki sposób to polecenie jest inne lub lepsze. Być może możesz również podać rzeczywiste numery kolumn, aby odpowiedzieć na aktualne pytanie PO.
Jeff Schaller

Dzięki temu mogłem korzystać ze stron podręcznika: p "-g, --general-numeric-sort, porównaj według ogólnej wartości liczbowej", co było potrzebne w moim przypadku.
dołącza


0
$ sort -k 1.3,1.3 myfile

Posortuje plik myfile w trzeciej kolumnie, jeśli plik nie ma separatora.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

rodzaj strony podręcznika:

[...] -k, --key = POS1 [, POS2] uruchom klucz na POS1 (początek 1), zakończ go na POS2 (domyślny koniec linii) [...] POS to F [.C] [ OPTS], gdzie F jest numerem pola, a C jest pozycją znaku w polu; oba są początkiem 1. Jeśli nie działa ani -t ani -b, znaki w polu są liczone od początku poprzedniej białej spacji. OPTS to jedna lub więcej opcji zamawiania jednoliterowych, które zastępują opcje zamawiania globalnego dla tego klucza. Jeśli nie podano klucza, użyj całej linii jako klucza.

Z --key = 1.3,1,3 mówiłeś, że jest tylko jedno pole (cała linia) i że porównujesz pozycję trzeciego znaku tego pola.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.