Сортировка с неравными пробелами в первом столбце

Мне нужно отсортировать этот список по имени, высокой температуре и низкой температуре:

Kuala Lumpur 78 56 Seoul 85 66 Karachi 95 75 Tokyo 85 60 Lahore 85 75 Manila 90 85 

Я понял, поскольку пробел является разделителем для столбца, который я мог бы просто sort -k 1 который дает мне это:

 Karachi 95 75 Kuala Lumpur 78 56 Lahore 85 75 Manila 90 85 Seoul 85 66 Tokyo 85 60 

Но «Куала-Лумпур» вызывает проблемы из-за пространства.

Поэтому я попытался обработать «Lumpur» в качестве столбца и отсортировать первый набор чисел, которые я сделал

 sort -k 3n 

но я понимаю:

 Tokyo 85 60 Seoul 85 66 Karachi 95 75 Lahore 85 75 Kuala Lumpur 78 56 <---Why is this out of order? Manila 90 85 

Как я могу справиться с этим одним пространством?

Как прокомментировали другие, это упростит работу с данными, если это значения, разделенные запятыми (CSV).

Вот мое решение для преобразования данных в CSV:

 $ cat file | sed 's/ \([0-9]\)/,\1/g' Kuala Lumpur,78,56 Seoul,85,66 Karachi,95,75 Tokyo,85,60 Lahore,85,75 Manila,90,85 

Он заменяет любое пробел, предшествующий цифре запятой. \1 ссылается на группу ([0-9]), цифру после пробела. Оттуда вы можете использовать sort с аргументом -t чтобы указать разделитель полей.

 $ cat file | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 Kuala Lumpur,78,56 Tokyo,85,60 Seoul,85,66 Lahore,85,75 Manila,90,85 Karachi,95,75 

Если вы хотите преобразовать обратно в пробелы или создать таблицу, вот два примера:

 $ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | tr , ' ' Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Lahore 85 75 Manila 90 85 Karachi 95 75 $ cat test | sed 's/ \([0-9]\)/,\1/g' | sort -t, -k2 | column -s, -t Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Lahore 85 75 Manila 90 85 Karachi 95 75 
 awk '{print $NF,$0}' file.txt | sort -nr -k1 | cut -d' ' -f2- 
  • $NF : количество полей, $0 : целая строка
  • sort -nr : числовое обратное (убывание)
  • sort -k1 : сортировать по первому столбцу (с разделителями по последовательностям пробелов и вкладок)
  • cut -d : разделитель (по умолчанию – вкладка)
  • cut -f2- : поля 2 до последнего (не cut -f2- разделители)
 ruby -e 'puts readlines.sort_by{|l|l.split[-1].to_i}.reverse' file.txt 
  • readlines = ARGF.readlines
  • split разбиение по пробелам по умолчанию

Если вы можете изменить свой файл, чтобы иметь столбцы с разделителями, ваша жизнь будет проще. Если изменение файла не является вариантом, этот однострочный движок Perl сделает это за вас:

 perl -ne 's/\s+/\t/g; s/([az])\s([az])/$1 $2/ig; s/\t$/\n/; print;' file | sort -t$'\t' -nk3 Kuala Lumpur 78 56 Tokyo 85 60 Seoul 85 66 Karachi 95 75 Lahore 85 75 Manila 90 85 

ОБЪЯСНЕНИЕ:

  • s/\s+/\t/g : измените ВСЕ пробелы на TAB.
  • s/([az])\s([az])/$1 $2/ig : изменить TAB, которые находятся между двумя буквами (без цифр), обратно в одиночные пробелы.
  • s/\t$/\n/ : первая подстановка вводит TAB в конце каждой строки, меняя ее на символ новой строки ( \n ).

  • sort -t$'\t' -nk3 : используйте TAB в качестве разделителя (у сортировки есть странный синтаксис, я знаю, см. здесь для получения дополнительной информации) и сортировать численно в третьем столбце.