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).
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
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
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.
[...] -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.
sort -u -k3 < myFile
.sort -u -k3 myFile
nawetOdpowiedzi:
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
-b
opcji 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ą
sort
wbudowanego polecenia).-k 3
jest 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),-u
polega 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 )).cat
jest polecenie con cat enate. Nie potrzebujesz tego tutaj.Jeśli kolumny są oddzielone przez coś innego, potrzebujesz
-t
opcji, aby określić separator.Podany przykładowy plik
a
Z
-u -k 3
:Wiersze 2 i 3 mają tę samą trzecią kolumnę, ale tutaj klucz sortowania znajduje się od trzeciej kolumny do końca wiersza, więc
-u
zachowuje obie.␠ca␠d
sortuje wcześniej,␠c␠c
ponieważ spacje są ignorowane w pierwszym przejściu w moim języku,cad
sortuje przedcc
.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).Zobacz, w jaki sposób kolejność
a b c d
ia c c c
są odwrócone. W pierwszym przypadku, ponieważ␠c␠c
sortuje 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 wstawacha b c d
przeda c c c
.Po zignorowaniu spacji klucz sortowania dla pierwszych 3 wierszy jest taki sam (
c
), więc są sortowane według porównania w ostatniej instancji.W ustawieniach regionalnych C
␠␠c
sortuje się wcześniej,␠c
ponieważ 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
).źródło
blank
oddzielone, w zależności od ustawień regionalnych mogą zawierać inne znaki oprócz spacji i tabulacji.3,3
robi? Dlaczego nie tylko3
?Jeśli rozumiesz „kolumnę” jak w pliku tekstowym (czwarty znak), to tak, twoje rozwiązanie powinno działać (lub nawet
sort -u -k3 myFile
pozwolić nasort
wykonanie 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(co jest równoważne trywialnemu,
ls -lS
ale ładnie służy przykładowi).źródło
sort -k 1.3,1.3
.ls -l | sort -k5,5n
sortować według rozmiaru.awk
Rozwiązaniem jest dokładnie to, co needed-- ja łatwo modyfikowane, aby dopasować wymagania kompleks sortowaniato właściwe polecenie do sortowania dowolnej listy zawierającej znaki numeryczne przy użyciu określonej kolumny
źródło
Możesz użyć biblioteki awk Velor :
źródło
Posortuje plik myfile w trzeciej kolumnie, jeśli plik nie ma separatora.
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.
źródło