Примечание: дополнительный вопрос здесь: как отдельно отсортировать строки в нескольких «чанках», разделенных заголовками?
Так что я нашел ответ, как сортировать строки в текстовых файлах по алфавиту. Но это не совсем то, что мне нужно сделать. У меня есть этот файл с профилями, содержащими 15 различных параметров, который входит в инструмент на работе и считывается машиной для получения списка профилей.
К сожалению, форматирование этого файла выглядит так:
[ProfileB]
param1=z
param2=y
param3=x
[ProfileA]
param1=k
param2=l
param3=
И я хочу отсортировать профили по алфавиту, но мне нужно, чтобы они оставались сгруппированными с их параметрами. Приведенный выше пример должен быть отсортирован так:
[ProfileA]
param1=k
param2=l
param3=
[ProfileB]
param1=z
param2=y
param3=x
Я предполагаю, что есть, что работать с фиксированным количеством строк (имя + параметры) или с символом «[» в качестве идентификатора начала группы строк.
Но это не в моих силах в манипулировании текстом. В моем распоряжении консольная команда Sublime Text, R или Linux.
источник
Ответы:
Это работает в моем Debian:
Для работы с файлом (ами) используйте перенаправление (я), например
{ sed … ; } <input.txt >output.txt
, гдеsed …
находится вся команда.Процедура выглядит следующим образом:
sed
вставляет нулевой символ перед каждым,[
который находится в начале строки, если строка не является первой. Таким образом, нулевые символы разделяют профили.sort -z
использует эти нулевые символы в качестве разделителей, поэтому сортирует целые профили, а не отдельные строки.tr
удаляет нулевые символыисточник
filter
деталь, чтобы понять, что происходит. У меня их нет со всей командой.Вот небольшой Perl-скрипт, который делает эту работу:
Сохраните его,
sortProfiles.pl
например, в файл и запустите:Как это устроено
while (<>)
).[profile]
во входном файле он запоминает свое имя в$profile
переменной.%profiles
хэша.В этом скрипте
%profiles
есть хеш. Его ключи - это имена профилей , а значения - массивы строк .Таким образом,
@{ $profiles{$profile} }
массив, который хранит строки для имени профиля в$profile
переменной.источник