Я использую Unix для сортировки файла с разделителями-запятыми с несколькими столбцами. До сих пор это отлично работало для сортировки данных по номерам или по алфавиту:
Файл примера перед любой сортировкой:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Сортировать файл: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Сортированный результат:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Вот проблема: я хочу отсортировать столбец 2 на основе пользовательской сортировки, что означает, что я хочу сначала Соединенные Штаты, затем Канаду, а затем Багамские острова:
Желаемый вид:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Есть ли способ передать unix sort пользовательский порядок сортировки, который затем можно применить? Что-то вроде:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Спасибо!
join
команда, но вы можете получить много сортировок: входные файлыjoin
должны быть отсортированы в одном порядке, а затем выsort
снова будете использовать их для помещения данных в другой порядок (и потеря столбца порядка сортировки как шаг после сортировки).t
вместоf
последней строки?Ответы:
Другой ответ и комментарий отвечают на вопрос в целом, вот как может выглядеть реализация:
источник
sed
не было необходимости.Вы не можете сделать это с помощью сортировки . На этом этапе вы действительно должны использовать awk / perl / your-language-of-choice . Вы можете обмануть это, хотя. Вы можете, например, использовать sed, чтобы изменить «Соединенные Штаты» на 0, «Канада» на 1 и «Багамские острова» на 2, затем выполнить числовую сортировку по этому столбцу, а затем вернуть его обратно. Или измените «Соединенные Штаты» на «Соединенные Штаты, 0» и т. Д., Сортируйте по дополнительному столбцу и затем отбрасывайте его.
источник
Я только что написал помощник csort, чтобы сделать это легко. Он добавляет к каждой строке значение по вашему выбору на основе совпадений подстроки или регулярного выражения в строке:
2=STR
Запись означает «совпадение , если второе поле равноSTR
».Затем вы можете при желании передать вывод,
cut -c3-
чтобы удалить префикс.источник