Sortowanie numeryczne w pliku rozdzielanym przecinkami w systemie Unix

8

Mam plik oddzielony przecinkami, który wygląda następująco:

100,00869184
6492,8361
1234,31
200,04071

Chcę użyć, sortaby posortować ten plik numerycznie tylko według pierwszej kolumny .

Pożądany rezultat:

100,00869184
200,04071
1234,31
6492,8361

Jak to osiągnąć za pomocą sortowania? Wygląda na to, że przecinki są traktowane jak separatory tysięcy zamiast separatorów, nawet jeśli nazywam je jako takie.

Zarówno sort -t',' -ni sort -t',' -nk1'daj mi to:

1234,31
200,04071
6492,8361
100,00869184

Sortowanie według wartości domyślnych (brak parametrów) lub użycie sort -t','daje mi to:

100,00869184
1234,31
200,04071
6492,8361

Sortowanie według liczby sort -ndaje mi to:

1234,31
200,04071
6492,8361
100,00869184

Jak mogę użyć sortowania, aby osiągnąć pożądany rezultat?

Edytowano, aby dodać: Jest to jednorazowa operacja, aby utworzyć posortowaną listę około 7 milionów linii, więc obejścia lub inne niekonwencjonalne metody są całkowicie dopuszczalne.

dpatchery
źródło
przykłady, które tu widzę , wydają się pokazywać -topcję spacji między -tpostacią a postacią
SeanC
Pierwsza myśl - użyj cięcia. Wybiera tylko określoną kolumnę na podstawie danego separatora. Również odpowiedź „Artem Ice” z tr. Kocham tr. Jestem jednak zbyt leniwy, aby to napisać i przetestować. Twoje zdrowie!
Vorac,
Możliwe to samo dla tab char: stackoverflow.com/questions/1037365/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

9

Jest to z pewnością nieprzyzwoite obejście, ale wymyśliłem sposób na zrobienie tego dzięki poradom @ slhck na temat lokalizacji. Jeśli pojawi się lepsza odpowiedź, która byłaby bardziej pomocna dla innych, na pewno ją zaakceptuję, ponieważ w zasadzie działa to tylko na mój konkretny problem.

Ustawiłem ustawienia regionalne na hiszpańskie (boliwijskie), aby przecinki były traktowane jak kropki dziesiętne, a następnie standardowe sortowanie numeryczne załatwiło sprawę.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
dpatchery
źródło
Ach, rozumiem, sugerowałbym użycie niemieckiego locale lub podobnego. Nie mogę teraz wymyślić niczego innego bez możliwości przetestowania tego lub dostępnych narzędzi, ponieważ jest to dość rzadka wersja Uniksa.
slhck
@slhck To wydaje się być sednem większości problemów, które utknąłem w systemie UNIX :) Dziękuję za pomoc w doprowadzeniu mnie do rozwiązania, niezależnie od tego.
dpatchery
6

GNU sortrobi to domyślnie:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Wersja:

$ gsort --version
sort (GNU coreutils) 8.19

Jest jednak jedno zastrzeżenie: jeśli sortowanie nie działa zgodnie z oczekiwaniami, localeprawdopodobnie ustawiono coś innego niż C. Dlaczego to? localedefiniuje sortowanie i interpretację liter, cyfr, znaków dziesiętnych i tak dalej.

Aby to sprawdzić, wystarczy wpisać localew terminalu. Być może jest LC_NUMERICustawiony en_US.UTF-8? To by wyjaśniało niewłaściwy porządek sortowania. Ustaw z powrotem na C:

export LC_NUMERIC=C

Następnie spróbuj sortponownie wykonać polecenie. Jeśli chcesz ustawić swój globalny localena C, zrób to za pomocą:

export LC_ALL=C
slhck
źródło
W moim środowisku nie mam dostępu do GNU. Czy to coś, co mogę łatwo uzyskać, a następnie usunąć po zakończeniu? HMU na czacie, jeśli ktoś chciałby mi pomóc to zrobić ... Jestem nowicjuszem w systemie UNIX.
dpatchery
Jestem prawie pewien, że to tylko localeproblem. Ale co sort --versionwłaściwie jest dla ciebie?
slhck
sort --version daje mi nielegalny argument. --polecenia też dla mnie nie działały. Sprawdziłem stronę podręcznika i nie ma żadnej jawnie wywołanej wersji, ale zawiera „HP-UX 11i wersja 2: sierpień 2003”, jeśli to w ogóle pomaga. Mój LC_NUMERIC jest ustawiony na „C”.
dpatchery
Na przykład niemieckie ustawienia narodowe byłyby używane ,jako separator dziesiętny. Jednak nigdy nie korzystałem z HP-UX.
slhck
1

Spróbuj dodać -gopcję, która ma służyć do sortowania numerycznego.

Próbować:

sort -t',' -g <whatever>
Fan wentylatora John
źródło
Czy -nsortowanie numeryczne nie jest ? -g daje mi nielegalną opcję.
dpatchery
-gjest general-numeric-sortopcją i powinna być dostępna w każdej najnowszej wersji sort. @dpatchery
slhck
To jest w moim miejscu pracy, więc prawie na pewno nie mam najnowszej wersji :)
dpatchery
0

Wymień ogranicznik:

cat commafile | tr , " " | sort -n 

- powinien ci pomóc.

defhlt
źródło