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

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

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 

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

3 Solutions collect form web for “Сортировка с неравными пробелами в первом столбце”

Как прокомментировали другие, это упростит работу с данными, если это значения, разделенные запятыми (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 в качестве разделителя (у сортировки есть странный синтаксис, я знаю, см. здесь для получения дополнительной информации) и сортировать численно в третьем столбце.

  • команда сортировки, понимающая логическую последовательность
  • Сортировка вывода `ps`
  • sort и ls - почему не заглавные буквы отсортированы в первую очередь?
  • Установленный coreutils на CentOS для sort -human-readable флага, но он все еще не работает
  • Сила сопоставления Bash (капитальные знаки против малого)
  • В чем разница между «sort -u» и «sort | уник»?
  • мы можем получить отсортированный выход grep
  • Сортировка по дате
  • Сравните и распечатайте данные из разных текстовых файлов на один в Shell
  • Сортировка данных журнала с помощью bash
  • Считайте уникальные строки только для заданного шаблона
  • Interesting Posts

    SSH не удалось аутентифицировать открытый ключ

    bath control, если используется флаг опции

    Источник FreeBSD и способы сборки

    Как получить уникальные строки на основе значения столбца

    mount: точка монтирования отсутствует

    Какой пакет RPM мне нужно установить, чтобы документация GObject была доступна локально на RHEL 7

    Как запустить приложение в фреймбуфере?

    Почему разные машины получают обновления в разное время?

    Фон Адвайты появляется гораздо более мрачно в реальности

    Хранить локальную копию монтирования nfs на компьютере

    Заменить строку M в файле1 на строку N в файле2

    Как скопировать последний файл из одного каталога в другой?

    Заполнение Bash не работает с именами файлов

    Как получить стандартный вывод / ошибку службы, управляемой systemd на EL7, чтобы перейти куда-нибудь, кроме / var / log / messages?

    Можно ли заставить члена группы запускать что-то, что разрешено только судьей, как он сам?

    Linux и Unix - лучшая ОС в мире.