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ę?
sort -u -k3 myFile
nawet
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ę?
sort -u -k3 myFile
nawet
Odpowiedzi:
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 -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
$ 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 -u
zachowuje obie. ␠ca␠d
sortuje wcześniej, ␠c␠c
ponieważ spacje są ignorowane w pierwszym przejściu w moim języku, cad
sortuje 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 d
i a 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 wstawach a b c d
przed 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 ␠␠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
).
blank
oddzielone, w zależności od ustawień regionalnych mogą zawierać inne znaki oprócz spacji i tabulacji.
3,3
robi? Dlaczego nie tylko 3
?
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ć na sort
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
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(co jest równoważne trywialnemu, ls -lS
ale ładnie służy przykładowi).
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 sortowania
sort -g -k column_number
to właściwe polecenie do sortowania dowolnej listy zawierającej znaki numeryczne przy użyciu określonej kolumny
Możesz użyć biblioteki awk Velor :
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ 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.
sort -u -k3 < myFile
.