Próbuję posortować proste dane rozdzielane potokami. Jednak sortowanie nie jest tak naprawdę sortowaniem. Przenosi mój wiersz nagłówka na dół, ale moje dwa wiersze zaczynające się od 241 są dzielone przez wiersz zaczynający się od 24.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Nagłówki kolumn są przenoszone na dół pliku, więc sortowanie wyraźnie je przetwarza. Ale rzeczywiste wartości nie są sortowane, jak się spodziewałam.
W tym przypadku pracowałem nad tym
sort sort_fail.csv --field-separator='|' -k1,1
Ale wydaje mi się, że nie powinno to być konieczne. Dlaczego sortowanie nie sortuje?
LC_COLLATE=C sort
. W zależności od tego, czego oczekujesz, możesz także potrzebowaćLC_COLLATE=C sort -t'|' -n
csvsort
zcsvkit
, które prawidłowo obsługuje notowane wartości.Odpowiedzi:
sort
rozpoznaje ustawienia regionalne, więc w zależności od ustawienia LC_COLLATE (dziedziczonego z LANG) możesz uzyskać różne wyniki:Może to powodować problemy w skryptach, ponieważ możesz nie być świadomy tego, na jakie ustawienia regionalne są wywoływane, a zatem możesz uzyskać różne wyniki.
Często zdarza się, że skrypty wymuszają wymagane ustawienie
na przykład
Ciekawe, że
|
postać wygląda dziwnie.Ale to dlatego, że mówi domyślna reguła en_US, która wywodzi się z ISO
Co oznacza, że
|
znak jest ignorowany, a kolejność sortowania wyglądałaby tak, jakby znak nie istniał.I to pasuje do „nieoczekiwanego” sortowania, które widzisz.
Obejściem tego jest użycie
-n
(do wymuszenia sortowania numerycznego) lub użycie separatora pól (tak jak to zrobiłeś) lub użycieC
ustawień regionalnych.źródło
--debug
opcja, która wskazuje klawisz (podkreślony) użyty do porównaniasort
używa całej linii zamiast zatrzymywania się na znakach, które zakładamy.Denerwuje mnie to, że
24
nie porusza się ze swojego miejsca między nimi241
. Drugie pole zaczyna się od1
. Próbując tego rodzaju z prowadzeniem4
na drugim polu,24
przesuwa się w dół, więc podejrzewam, żesort
po prostu ignoruje,|
chyba że podano inaczej. Spróbujsort -n
...źródło
-n, --numeric-sort porównaj według wartości liczbowej ciągu
Bez -n, 210 przez tekst wyprzedza 23, jeśli chodzi o znak mojej postaci.
źródło