Konsolowe sortowanie

Data publikacji: 2015-09-08 | Tagi:

Ku pamięci!

Podmiot: duży plik csv

Misja: posortować po drugiej kolumnie, malejąco

Ok, krótko i na temat - mając spory plik csv (załóżmy ok. 30 mln wierszy) z kilkoma kolumnami nie ma praktycznie szans, żeby zaimportować go do jakiegoś arkusza i posortować - bidul się wyłoży na braku wolnych wierszy i koniec.

Z pomocą przychodzi oczywiście sort, który domyślnie sortuje linia po linii podany strumień.

Jednak my potrzebujemy czegoś więcej, załóżmy, że nasz plik to wspomniane 30 mln linii, w każdej po osiem wartości oddzielonych przecinkami. A my chcemy posortować go linia po lini, po drugiej z tych wartości.

cat input.csv | sort -t\, -k2nr > sorted_output.csv

Krótkie wyjaśnienie: input.csv to oczywiście plik źródłowy. Przełącznik -t określa separator kluczy (przecinek w naszym wypadku, backslash go oczywiście escapuje). Kolejny przełącznik (-k2nr) oznacza, że kluczem jest druga wartość (2), mamy sortować numerycznie (n) i w odwrotnej kolejności (r). Całość ma wylądować w pliku sorted_output.csv.

Mała uwaga, jeśli określamy klucz sortowania używając -k to opcję sortowania rosnąco/malejąco ustawiamy oddzielnie dla każdego klucza. Przykładowo:

sort (...) -k2nr -k3 (...)

Pierwszym kluczem będzie druga pozycja w linii, drugim kluczem będzie trzecia pozycja linii. Najpierw posortujemy pierwszy klucz malejąco, a potem drugi rosnąco.

Oto prosty przykład. Załóżmy, że mamy plik test.csv o zawartości:

1,23,Ameryka
2,14,Belgia
3,23,Afryka
4,23,Antarktyda
5,1,Polska
6,1,Portugalia
7,1,Polinezja

Przykłady działania różnego sortowania:

cat test.csv | sort -t\, -k2nr -k3 
(druga kolumna malejąco, numerycznie, trzecia kolumna rosnąco)

3,23,Afryka
1,23,Ameryka
4,23,Antarktyda
2,14,Belgia
7,1,Polinezja
5,1,Polska
6,1,Portugalia
cat test.csv | sort -t\, -k2nr -k3r
(druga kolumna malejąco, numerycznie, trzecia kolumna malejąco)

4,23,Antarktyda
1,23,Ameryka
3,23,Afryka
2,14,Belgia
6,1,Portugalia
5,1,Polska
7,1,Polinezja


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: