Mam plik csv i chciałbym posortować go według priorytetu kolumn, na przykład „kolejność według”. Na przykład:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Gdyby ta sytuacja była wynikiem „wyboru”, „kolejność według” wyglądałaby następująco: kolejność według kolumny2, kolumny1, kolumny3 - wynik byłby taki:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Chciałbym wiedzieć, jak uzyskać ten sam wynik za pomocą polecenia „sort” w systemie Unix.
unix
sorting
csv
sql-order-by
Rafael Orágio
źródło
źródło
Odpowiedzi:
źródło
-n
opcji, która „porównuje według wartości liczbowej ciągu znaków” lub-g
opcji, która „porównuje według ogólnej wartości liczbowej”. Ciągowe porównanie wartości liczbowych da liczby uporządkowane w ten sposób1,10,2,20
. Przynajmniej są to opcje dostępne w mojej wersji sortowania na CentOS. Powinieneś sprawdzić na stronie podręcznika, jakie są poprawne opcje w twojej wersji sortowania.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
pracował dla mnie.sort --field-separator=';' --key={2,1,3}
. To działałoGNU coreutils 8.4
od kwietnia 2016 r.--key={2,1,3}
używa rozszerzenia nawiasów klamrowych bashZałóżmy, że
3;10;3
wunsorted.csv
pliku jest inny wiersz . Myślę, że spodziewasz się wyniku posortowanego numerycznie:a nie alfabetycznie:
Aby to uzyskać, musisz użyć
-n
:Warto wspomnieć, że
2,2
należy z niego skorzystać. Gdyby tylko2
jest używany,sort
pobiera ciąg od początku pola 2 do końca.2,2
upewnia się, że2
używane jest tylko pole .źródło
3;10;3
,3:10:5
,3:10;2
,3;10;3
w tej kolejności w pliku źródłowym, a przy użyciu tylko-k 2,2
wydaje się, aby posortować kolumny 2 i 3. Na stronie mówi mężczyzna"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. W moim przypadku wcześniejszy klucz (wartość = 10) porównywał się równo, jednak nie podawałem go-k
wielokrotnie. Nie jestem pewien, czy jest to niezawodne zachowanie lub związane z moim systemem (Mac). Ostatecznie nie ma to jednak znaczenia, o ile pierwotne sortowanie jest prawidłowe.-s
stabilny rodzaj, który ignoruje równe klucze, który według człowieka jest najwyraźniej szybszy.Powyższa odpowiedź Charliego nie zadziałała dla mnie na Cygwin (wersja sortowania 2.0, GNU textutils), co zadziałało:
źródło
sort --field-separator=';' -k2 -k1 -k3 test.csv
..i jeśli ktoś zastosował rozwiązanie „sort”, ale teraz chce uzyskać więcej niż jeden unikalny wpis w wierszu (tj. X górnych liczb unikalnych wpisów), po posortowaniu pliku za pomocą polecenia „sort” można użyć mała aplikacja, którą stworzyłem tutaj:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
źródło
cat unsorted-file | sort | uniq | head -X
- kiedyX
jest liczbą pierwszych wierszy, które chcesz wyprowadzić.uniq
w kolejności potoków, między asort
ihead
, które nadaje niepowtarzalność wszystkim posortowanym wierszom tuż przed wyodrębnieniem górnych wierszy.