2

Этот вопрос дополняет этот: сортируйте пакеты строк по алфавиту. После ответа там оказалось, что я полностью неправильно понял вопрос и решил другую проблему. Не желая, чтобы мое решение было забыто, я публикую здесь проблему (и мое решение ниже).


Рассмотрим текст вроде:

[ProfileB]
param3=z
param2=y
param1=x
[ProfileA]
param1=k
param3=l
param2=

Мне нужно отсортировать параметры в каждом блоке [Profile*] отдельно. Приведенный выше пример должен быть отсортирован по этому:

[ProfileB]
param1=x
param2=y
param3=z
[ProfileA]
param1=k
param2=
param3=l

Как я могу сделать это с помощью стандартных инструментов Unix/Linux?

1 ответ1

2

Это работает в моем Debian:

sed '1 ! s/^\[/\x00\[/g' |
split -t '\0' -l 1 --filter='
   tr -d "\0" |
   { IFS="" read; printf "%s\n" "$REPLY"; sort; }
'

Для работы с файлами используйте перенаправления, например, { sed … ; } <input.txt >output.txt , где sed … - это целая команда.

Процедура выглядит следующим образом:

  1. sed вставляет нулевой символ перед каждым [ в начале строки, если строка не является первой. Таким образом, нулевые символы разделяют профили.
  2. split генерирует порции, принимая записи, разделенные нулевыми символами, по одной записи на порцию. Вместо записи в файлы split вызывает фильтр для каждого блока отдельно:
    1. сначала tr удаляет нулевые символы;
    2. затем read и printf только вывод первой строки (заголовка) фрагмента;
    3. наконец, sort выполняет свою работу с оставшимися строками.
  3. Чанки обрабатываются последовательно; выход представляет собой единый каскадный поток.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .