У меня есть CSV-файл, и я хотел бы отсортировать его по приоритету столбца, например «по порядку». Например:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Если бы эта ситуация была результатом «выбора», «упорядочить по» было бы следующим образом: упорядочить по столбцу 2, столбцу 1, столбцу 3 - результат будет:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Я хотел бы знать, как получить тот же результат, используя команду «sort» в Unix.
unix
sorting
csv
sql-order-by
Рафаэль Ораджио
источник
источник
Ответы:
источник
-n
опции, которая будет «сравнивать по числовому значению строки», или-g
опции, которая будет «сравнивать по общему числовому значению». При строковом сравнении числовых значений числа будут упорядочены как1,10,2,20
. По крайней мере, это варианты, доступные в моей версии сортировки на CentOS. Вы должны проверить на странице руководства, какие правильные параметры есть в вашей версии sort.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
у меня сработало.sort --field-separator=';' --key={2,1,3}
. Это работалоGNU coreutils 8.4
с апреля 2016 года--key={2,1,3}
используется расширение bash в фигурных скобкахПредположим, у вас есть еще одна строка
3;10;3
в вашемunsorted.csv
файле. Тогда я думаю, вы ожидаете численно отсортированного результата:а не отсортированный по алфавиту:
Чтобы получить это, вы должны использовать
-n
:Стоит упомянуть, что
2,2
нужно использовать. Если2
используется только , тоsort
переносит строку от начала поля 2 до конца.2,2
гарантирует, что используется только поле2
.источник
3;10;3
,3:10:5
,3:10;2
,3;10;3
в том порядке , в исходном файле, а при использовании только-k 2,2
оказывается для сортировки по колонке 2 и 3. Страница человек говорит"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. В моем случае предыдущий ключ (значение = 10) сравнивался с равным, однако я не указывал-k
несколько раз. Я не уверен, что это надежное поведение или связано с моей системой (Mac). В конечном итоге это не имеет значения, если первичная сортировка верна.-s
стабильная сортировка, которая игнорирует одинаковые ключи, что, по-видимому, быстрее, по мнению человека.Приведенный выше ответ Чарли не сработал для меня в Cygwin (версия сортировки 2.0, GNU textutils), следующее:
источник
sort --field-separator=';' -k2 -k1 -k3 test.csv
..и если кто-то следовал решению 'sort', но теперь хочет получить больше одной уникальной записи в строке (т.е. максимальное количество уникальных записей X), как только вы отсортировали файл с помощью 'sort', вы можете использовать небольшое приложение, которое я создал здесь:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
источник
cat unsorted-file | sort | uniq | head -X
- whenX
- количество первых строк, которые вы хотите вывести.uniq
в порядке конвейера между символами «sort
и»head
, которая дает уникальность всем отсортированным строкам непосредственно перед извлечением верхних строк.