Так что я нашел ответ, как сортировать строки в текстовых файлах по алфавиту. Но это не совсем то, что мне нужно сделать. У меня есть этот файл с профилями, содержащий 15 различных параметров, который входит в инструмент на работе и считывается машиной для получения списка профилей.
К сожалению, форматирование этого файла выглядит так:
И я хочу отсортировать профили по алфавиту, но мне нужно, чтобы они оставались сгруппированными с их параметрами. Приведенный выше пример должен быть отсортирован так:
Я предполагаю, что есть, что работать с фиксированным числом строк (имя + параметры) или с символом «[» в качестве идентификатора начала группы строк.
Но это не в моих силах в манипулировании текстом. В моем распоряжении консольная команда Sublime Text, R или Linux.
Требует ли "прибор" ** ** профили сортировки?
glenn jackman 6 лет назад
0
Я надеюсь, что кто-то может вам помочь, но тем временем вы должны выучить интерпретированный язык, не такой тяжелый, как C, и не такой беспокойный, как bash. Что-то вроде ruby, python или perl.
barlop 6 лет назад
2
@glennjackman Нет, но если файл не отсортирован, профиль загружается в том же порядке, что и файл.
Paul Giroud 6 лет назад
0
@barlop У меня есть основы Python и Perl, и я хочу их использовать (что я имел в виду, имея в виду доступ к командной консоли)
Paul Giroud 6 лет назад
1
2 ответа на вопрос
3
Kamil Maciorowski
Это работает в моем Debian:
sed '1 ! s/^\[/\x00\[/g' | sort -z | tr -d "\0"
Для работы с файлом (ами) используйте перенаправление (я), например { sed … ; } <input.txt >output.txt, где sed …находится вся команда.
Процедура выглядит следующим образом:
sedвставляет нулевой символ перед каждым, [который находится в начале строки, если строка не является первой. Таким образом, нулевые символы разделяют профили.
sort -z использует эти нулевые символы в качестве разделителей, поэтому сортирует целые профили, а не отдельные строки.
tr удаляет нулевые символы
Нет претензий, я получил выходные файлы, когда удалил часть `filter`, чтобы понять, что происходит. У меня их нет со всей командой.
Paul Giroud 6 лет назад
0
Я думаю, что у меня есть проблема, и это может быть потому, что я не был достаточно ясно о том, что я хотел сделать. Ваше решение сортирует все строки внутри профиля (то, что я назвал param1, param2 и param3 в моем примере) в алфавитном порядке, но сохраняет первоначальный порядок профилей (если первый профиль в списке - [B], а второй - второй). [A], так и останется). Я хочу отсортировать имена профилей, а не содержащиеся в них параметры (которые уже расположены в алфавитном порядке.
Paul Giroud 6 лет назад
1
Мой плохой, извините, английский не мой родной язык, и я допустил ошибку в своем запросе! большое спасибо вам
Paul Giroud 6 лет назад
0
0
Alexey Ivanov
Вот небольшой Perl-скрипт, который делает эту работу:
my %profiles; my $profile; while (<>) { if (/\[(.+)\]/) { $profile = $1; next; } next if !defined $profile; chop if /\n$/; push @{ $profiles{$profile} }, $_; } foreach my $key (sort keys %profiles) { print "[$key]\n"; foreach my $line (sort @{ $profiles{$profile} }) { print "$line\n"; } }
Сохраните его, sortProfiles.plнапример, в файл и запустите:
Для каждого профиля [profile]во входном файле он запоминает свое имя в $profileпеременной.
Сохраняет каждую строку после заголовка профиля внутри массива.
Затем он сортирует ключи %profilesхэша.
Он также сортирует строки внутри массива.
В этом скрипте %profilesесть хеш. Его ключи - это имена профилей, а значения - массивы строк . Таким образом, @{ $profiles{$profile} }массив, который хранит строки для имени профиля в $profileпеременной.
Я думаю, что это отвечает как на этот вопрос, так и на [бесплатный] (https://superuser.com/q/1328504).
Alexey Ivanov 6 лет назад
0