Сортировка файла по группе строк

Ident, pident и oident были упразднены в пользу пакета authd. Он обладает практически всеми возможностями pident, но при этом хорошо интегрируется в фреймворк активации сокетов systemd.

3
12.06.2019, 01:21
3 ответа

Используя Perl, вы можете запустить что-то вроде:

  • хлебать файл(perl -0n)
  • разбить ввод строками без отступаsplit(/^(?=\S)/m)
  • сортировать и печатать

perl -0ne 'print sort split(/^(?=\S)/m) ' ex 
6
27.01.2020, 21:12

с помощью awkмы могли бы удерживать каждую группу в массиве, связанном с awk, на основе разрыва строки -между каждой группой; затем asort()и распечатайте его, отсортированный по используемому циклу -.

awk '/^$/{ ++group; next} { saving[group]=(saving[group]==""? $0 : saving[group] RS $0) }
END{ asort(saving); 
     for(group in saving) print saving[group]
}'  infile

примечание:вы можете использовать элемент PROCINFO["sorted_in"], чтобы указать, какой тип сортировки вам нужен; например, PROCINFO["sorted_in"]="@val_str_desc"отсортирует val ue нашего массива как str ing и в порядке desc .

тестирование входного файла типа:

BFirstSection
    Unique first line in first section
    Unique second line in first section

DSecondSection
    Unique first line in second section
    Unique second line in second section

Aanothersection...
   ...
   ...

CfourthSection
    Unique first line in Nth section
    Unique second line in Nth section

вы получите вывод как:

Aanothersection...
   ...
   ...
BFirstSection
    Unique first line in first section
    Unique second line in first section
CfourthSection
    Unique first line in Nth section
    Unique second line in Nth section
DSecondSection
    Unique first line in second section
    Unique second line in second section
0
27.01.2020, 21:12

Сначала sed помещает каждый раздел в одну строку, используя текст <EOL>в качестве разделителя между строками разделов. Затем я сортирую разделы и использую второй sed, чтобы вернуть каждый <EOL>обратно на новую строку.

sed -r ':r;$!{N;br};s:\n([[:blank:]])(\1*):<EOL>\1\2:g' file|sort|sed -r '/^$/d;:l;G;s:(.*)<EOL>(.*)(\n):\1\3\2:;tl;$s:\n$::'

Я не выбрал символ в качестве разделителя, так как он может быть во входном файле, поэтому вместо этого я использовал <EOL>.

Результат:Я добавил новую строку после каждого раздела, кроме последнего, чтобы воссоздать стиль входного файла.

FirstSection
    Unique first line in first section
    Unique second line in first section

NthSection
    Unique first line in Nth section
    Unique second line in Nth section

SecondSection
    Unique first line in second section
    Unique second line in second section
3
27.01.2020, 21:12

Теги

Похожие вопросы