Сгруппированная сортировка непрерывных абзацев (разделенный пустой строкой)?

Копайтесь наследие (0.9x) поддерживает ext2, и ext3 (ext3 обратно совместимо с ext2), но не ext4 (если Вы не выключили обратно-несовместимые функции, который не оставляет много дополнительного совершенства по сравнению с ext3). Разработка наследия Личинки, остановленного прежде ext4, была сформировавшейся. Существуют неофициальные патчи для поддержки ext4 на наследии Личинки; обсуждение ошибки Debian № 511121 имеет указатель на два патча (один из которых находится в некоторых версиях Ubuntu).

Grub2 (1.9x, более точно с тех пор 1.97) поддерживает ext2, ext3 и ext4, с тем же модулем (ext2.mod).

Ни одна из новых возможностей ext4 не особенно полезна для отдельного /boot раздел, поэтому если это - то, что Вы имеете, Вы могли бы также придерживаться ext2. Но если Вы сохраняете свое ядро и конфигурацию Личинки на корневом разделе, если это - ext4, удостоверьтесь, что Ваша версия Личинки является достаточно последней или исправлена.

8
16.08.2013, 02:00
5 ответов

Drav awk решение хорошо, но это означает выполнять то sort команда на абзац. Чтобы избежать, чтобы, Вы могли сделать:

< file awk -v n=0 '!NF{n++};{print n,$0}' | sort -k1n -k2 | cut -d' ' -f2-

Или Вы могли выполнить во всем этом perl:

perl -ne 'if (/\S/){push@l,$_}else{print sort@l if@l;@l=();print}
          END{print sort @l if @l}' < file

Обратите внимание, что выше, разделители являются пустыми строками (для awk один, строки только с пробелами или символами табуляции, для perl один, любой символ пространства по горизонтали или пространства по вертикали) вместо пустых строк. Если Вы действительно хотите пустые строки, можно заменить !NF с !length или $0=="", и /\S/ с /./.

9
27.01.2020, 20:08
  • 1
    Благодаря Вам также, специально для awk решение, которое избегает sort наверху! Подлый! –  syntaxerror 15.08.2013, 00:46

Если у Вас есть GNU awk доступный, Вы могли бы отсортировать каждый блок с помощью встроенного asort() функция. Что-то вроде этого:

blocksort.awk

function sort_n_print(array) {
  asort(array)
  for(i=1; i<=length(array); i++)
    print array[i]
  delete array
}

NF { a[++x] = $0 }

!NF { sort_n_print(a); print }

END { sort_n_print(a) }

Выполните его как это:

awk -f blocksort.awk infile
4
27.01.2020, 20:08
awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file

Установка разделителя записей RS к пустой строке заставляет awk ступить в абзацы за один раз. Для каждого абзаца передайте абзац по каналу (в $0) к cmd (который установлен на sort) и распечатайте вывод. Распечатайте пустую строку для разделения выходных абзацев с a print "".

Если мы даем примеры жемчуга, то я представляю альтернативный подход, чем тот из Stephane:

perl -e 'undef $/; print join "\n", sort (split /\n/), "\n" 
    foreach(split(/\n\n/, <>))' < file

Сбросьте разделителя полей (undef $/), это позволяет нам использовать <> и получите весь STDIN. Мы затем split это вокруг \n\n (абзацы). foreach "абзац", sort строки splitзвон вокруг новых строк, sortлуг и затем joinлуг их назад вместе и лавирующий на запаздывании \n.

Однако это имеет один побочный эффект добавления "запаздывающего абзаца" разделитель в последнем абзаце (если это не имело того прежде). Можно обойти это с немного менее симпатичным:

perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
    foreach(@list = split(/\n\n/, <>))' < file

Это присваивает абзацы @list, и затем существует "троичная операция", чтобы проверить, является ли это последний элемент foreach ( \$_ == \$list[-1] проверьте).печать "" если это (? ...), еще (: ...) печать "\n" для всех других "абзацев" (элементы @list).

8
27.01.2020, 20:08
  • 1
    Это аккуратно!Спасибо. Вы на самом деле вызываете /usr/bin/sort с той строкой или это awk встроенная команда "вида"? –  syntaxerror 14.08.2013, 21:41
  • 2
    При Вызове команды вида следовательно требование для закрытия (cmd) на каждом цикле :) –  Drav Sloan 14.08.2013, 21:44

Я написал инструмент на языке haskell, который позволяет вам использовать sort, shuf, tac или любую другую команду для абзацев текста.

https://gist.github.com/siers/01306a361c22f2de0122
РЕДАКТИРОВАТЬ: инструмент также включен в это репо: https://github.com/siers/haskell-import-sort

Он разбивает текст на блоки, объединяет подблоки с помощью символа \ 0 , передает команду по конвейеру и, наконец, делает то же самое в обратном порядке.

28-08-2015 : Я нашел другое, личное использование этого инструмента - выделение N абзацев после строки.

paramap grep -aA2 '^reddit usernames' < ~/my-username-file
reddit usernames

foo
bar
baz

a couple
more of these
5
27.01.2020, 20:08

TXR Шаг за шагом Lisp:

$ cat data
Echo
Alpha
Delta
Charlie

Golf
Bravo
Hotel
Foxtrot

$ txr -p '(get-lines)' < data
("Echo" "Alpha" "Delta" "Charlie" "" "Golf" "Bravo" "Hotel" "Foxtrot")

$ txr -t '(get-lines)' < data
Echo
Alpha
Delta
Charlie

Golf
Bravo
Hotel
Foxtrot

$ txr -p '(partition* (get-lines) (op where [chain length zerop]))' < data
(("Echo" "Alpha" "Delta" "Charlie") ("Golf" "Bravo" "Hotel" "Foxtrot"))

$ txr -p '[mapcar sort (partition* (get-lines) (op where [chain length zerop]))]' < data
(("Alpha" "Charlie" "Delta" "Echo") ("Bravo" "Foxtrot" "Golf" "Hotel"))

$ txr -p '(interpose (list "") [mapcar sort (partition* (get-lines) (op where [chain length zerop]))])' < data
(("Alpha" "Charlie" "Delta" "Echo") ("") ("Bravo" "Foxtrot" "Golf" "Hotel"))

$ txr -t '(interpose (list "") [mapcar sort (partition* (get-lines) (op where [chain length zerop]))])' < data
Alpha
Charlie
Delta
Echo

Bravo
Foxtrot
Golf
Hotel

Ссылки: get-lines , раздел * , op , где , цепочка , длина , zerop , mapcar , вставьте .

1
27.01.2020, 20:08

Теги

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