sort
udostępnia dwa rodzaje sortowania numerycznego. To jest ze strony podręcznika:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
Co za różnica?
sort
nie jestman
stroną, aleinfo
page (info sort
).Odpowiedzi:
Ogólne sortowanie numeryczne porównuje liczby jako zmiennoprzecinkowe, co pozwala na notację naukową, np. 1.234E10, ale jest wolniejsze i obarczone błędem zaokrąglenia (1.2345678 może nastąpić po 1.2345679), sortowanie numeryczne jest zwykłym sortowaniem alfabetycznym, w którym 10 występuje po 9.
Zobacz http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
źródło
-k3.2n
lub-k3.2g
, jest to sortowanieR10
przedR2
. Sortowanie jest leksykograficzne, a nie numeryczne. Spodziewam się, że potraktuje pole od drugiego znaku jako liczbę.sort
kluczowe specyfikacje. są prawdziwie bizantyjskie - w skrócie: puste miejsce (a) poprzedzające pole są uważane za część pola , więc char. indeks 1 wskazuje na (pierwszy) odstęp poprzedzający pole, a nie rzeczywisty pierwszy znak pola. Dodaj przyrostek char. index z,b
aby rozwiązać ten problem, tj .:-k 3.2bn,3
(zwróć uwagę, że opcja globalna nie działa w tym przypadku). Zwróć również uwagę na dodanie , które zapewnia, że używane jest tylko trzecie pole - bez tego indeksu drugiego pola używana jest reszta całej linii .-b
,3
Powinieneś uważać na swoje ustawienia regionalne. Na przykład, możesz chcieć posortować liczbę zmiennoprzecinkową (jak 2.2), podczas gdy twoje ustawienia narodowe mogą oczekiwać użycia przecinka (jak 2,2).
Jak informowaliśmy na tym forum , możesz mieć błędne wyniki używając flag -n lub -g.
W moim przypadku używam:
aby posortować szóstą kolumnę zawierającą:
w celu uzyskania
źródło
-n
rozpoznać przecinka jako separatora tysięcy - „1000” jest traktowane tak samo jak „1”.sort
używa logiki najdłuższego prefiksu : używana jest najdłuższa część wiersza / klucza, który rozpoznaje jako liczbę; w ustawieniach regionalnych używających.
znaku radix przestanie czytać o,
.LC_ALL=C
to rzeczywiście najbardziej solidny wybór; jeśli jednakLC_ALL
zdarzy się , że nie postawisz seta,LANG=C
zadziała też.LANG=C sort -k 6,6n file
jest zarówno prostsza, jak i lokalizuje wpływ ustawienia zmiennej środowiskowejLANG
na określone polecenie.Oprócz zaakceptowanej odpowiedzi, w której wspomina się o
-g
dopuszczeniu notacji naukowej , chcę pokazać część, która najprawdopodobniej powoduje niepożądane zachowanie.Z
-g
:Spójrz na
zoo
trzy ważne rzeczy:Linia zaczyna się od
NAN
(np.Nana
Inani lol
) lub-INF
(pojedynczy myślnik, nie--INF
) i kończy się, ale przed cyframi. AINF
przejdź do ostatniego po cyfrach, ponieważ oznacza to nieskończoność .NAN
,INF
I-INF
są wrażliwe na wielkość liter .Linie zawsze ignorować spacje po obu stronach
NAN
,INF
,-INF
(niezależnie odLC_CTYPE
). Inne alfabetyczne mogą ignorować białe znaki z obu stron, w zależności od ustawień regionalnychLC_COLLATE
(np.LC_COLLATE=fr_FR.UTF-8
Ignoruj, aleLC_COLLATE=us_EN.UTF-8
nie ignoruj).Więc jeśli sortujesz dowolne alfanumeryczne , prawdopodobnie nie chcesz
-g
. Jeśli naprawdę potrzebujesz porównania notacji naukowej z-g
, prawdopodobnie chcesz wyodrębnić dane alfabetyczne i liczbowe i zrobić porównanie oddzielnie .Jeśli potrzebujesz tylko zwykłego
1, -1
sortowania liczb (np. ) I uważasz, że0x/E/+ sorting
nie jest to ważne, po prostu użyj-n
wystarczającej ilości:Albo
-g
bądź-n
świadomy efektu lokalnego . Możesz chcieć określićLC_NUMERIC
jako,us_EN.UTF-8
aby uniknąć fr_FR.UTF-8 sortowanie-
z liczbą zmiennoprzecinkową nie powiodło się :Z
LC_NUMERIC=en_US.UTF-8
:Lub
LC_NUMERIC=us_EN.UTF-8
w grupie+|-|space
zalpha
:Prawdopodobnie chcesz określić,
locale
kiedy używasz,sort
jeśli chcesz napisać przenośny skrypt.źródło