2013-06-08 23 views
6

Powiedz, że mam ten plik.sortowanie za pomocą wielu kluczy za pomocą polecenia sortowania Linuksa

$ cat a.txt 
c 1002 4 
f 1001 1 
d 1003 1 
a 1001 3 
e 1004 2 
b 1001 2 

Chcę go posortować według drugiej kolumny, a następnie według trzeciej kolumny. Kolumna druga to liczby, a kolumna 3 może być traktowana jako ciąg. Wiem, że następujące polecenie działa dobrze.

$ sort -k2,2n -k3,3 a.txt 
f 1001 1 
b 1001 2 
a 1001 3 
c 1002 4 
d 1003 1 
e 1004 2 

Jednak myślę, że sort -k2n a.txt powinien również działać, a tak nie jest.

$ sort -k2n a.txt 
a 1001 3 
b 1001 2 
f 1001 1 
c 1002 4 
d 1003 1 
e 1004 2 

Wygląda na to, że sortuje według kolumny drugiej, a następnie według kolumny pierwszej zamiast trzeciej. Dlaczego to się dzieje? Czy to błąd, czy nie? Przyczyna sort -k2 a.txt działa poprawnie z powyższymi danymi, ponieważ te liczby są po prostu ustaloną szerokością.

Moja sortowana wersja to sort (GNU coreutils) 8.15 w cygwin.

+0

Interesujące. "sort -k2 a.txt" będzie działać w * tym * przypadku. '-k2' mówi, aby sortować za pomocą klucza, który zaczyna się od pola 2 i kontynuuje do końca linii. '-k2n' mówi, aby sortować pole 2 w porządku numerycznym; może to oznaczać, że klucz sortowania kończy się napotkaniem białych znaków między polami 2 i 3. Dobrym pomysłem może być wklejenie wersji swojego sortu do pytania. –

+0

Używanie 'sort (GNU coreutils) 8.5' Jestem w stanie odtworzyć opisane zachowanie na stabilnej wersji Debiana. – alk

+0

@ MikeSherrill'Catcall 'Podczas próby sortowania wartości liczbowej numerycznie sortowanie (1) powraca do sortowania ciągów znaków. '" 1001 3 "' itp. Jako przez '-k2n' są * nie * liczbowe. – PointedEars

Odpowiedz

9

Uważam tę ostrożność w GNU sort docs.

Sortuj numerycznie na drugim polu i rozwiązać więzy sortując alfabetycznie na trzecim i czwartym znaków pola pięć. Użyj ":" jako ogranicznika pola.

 sort -t : -k 2,2n -k 5.3,5.4 

Zauważ, że jeśli napisał -k 2n zamiast -k 2,2n rodzaju musiałby stosować wszystkie znaki począwszy od drugiego pola i sięgających do końca wiersza jako klucz podstawowy numerycznej. W przypadku znacznej większości aplikacji przetwarzanie kluczy obejmujących więcej niż jedno pole jako numeryczne nie przyniesie oczekiwanych rezultatów.

Nie jestem pewien, na czym kończy się, kiedy ocenia "1001 3" jako klucz numeryczny, ale "nie zrobi tego, czego się spodziewasz". Wydaje się oczywiste, że właściwe jest określenie każdego klucza niezależnie.

Ta sama strona mówi o rozwiązaniu "więzi".

Wreszcie, w ostateczności, gdy wszystkie klucze porównania równe, sort porównuje całe linie jakby żadnych opcji zamawiania innych niż --reverse (-R) były określony.

Wyznaję, że jestem trochę zaskoczony, jak to interpretować.

+0

Ostatni akapit z całą pewnością oznacza, że ​​wartości dla wszystkich określonych kluczy uważanych za równe, sort (1) używa prostego porównania ciągów na liniach i obserwuje tylko wyrażenie '--reverse' (lub' -r'), jeśli jest określone. Na przykład, jeśli istnieją linie 'foo: 42: bar: baz: blabla' i' foo: 42: baz: bar: blabla', pierwsza z nich jest posortowana przed tymi ostatnimi z powodu '" paska "' < '" baz "' i na odwrót, jeśli użyjesz '-r'. – PointedEars

+0

Dzięki @ Mike's effort. Myślę, że doktorzy trochę wyjaśniają. Powinniśmy być ostrożni, traktując klucze numeryczne jako więcej niż jedno pole. – yejinxin

+0

@ PointedEars: To by wyjaśniało zachowanie, tak myślę. Najpierw sortuj według klucza, a następnie przez całą linię. Cała linia zaczyna się oczywiście od pierwszego pola. –

Powiązane problemy