Я думаю, что теперь у меня довольно большой опыт сортировки по столбцам ; однако я пока не нашел ничего, как сортировать непрерывные строки .
Предположим, у нас есть текстовый файл, который выглядит следующим образом: (очень упрощенно, конечно)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Теперь можно ли сортировать строки буквенно-цифрово для каждого блока в отдельности ? Я имею в виду, что результат выглядит так:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
Судя по тому, что я нашел на sort
странице руководства , это может быть невозможно с помощью встроенной sort
команды UNIX . Или это можно сделать, не прибегая к внешним / сторонним инструментам?
источник
awk
решение, которое позволяет избежатьsort
накладных расходов! Подлый!Установка разделителя записей
RS
на пустую строку делает шаг awk по абзацам за раз. Для каждого абзаца передайте абзац (in$0
) на cmd (который установлен наsort
) и распечатайте вывод. Распечатайте пустую строку, чтобы отделить выходные абзацы с помощьюprint ""
.Если мы приводим примеры на Perl, я представляю альтернативный подход, чем подход Стефана:
Отключите разделитель полей (
undef $/
), это позволяет нам использовать<>
и получать весь STDIN. Мы тоsplit
что вокруг\n\n
(абзацы).foreach
«абзац»,sort
строки,split
перебирая новые строки, соединяя их,sort
а затемjoin
соединяя их и следуя за трейлингом\n
.Тем не менее, это имеет один побочный эффект добавления разделителя «конечный абзац» в последний абзац (если у него не было раньше). Вы можете обойти это с немного менее симпатичным:
Это назначает абзацы
@list
, и затем есть «троичная операция», чтобы проверить, является ли это последним элементомforeach
(\$_ == \$list[-1]
проверка). печать,""
если это (? ...
), иначе (: ...
) печать"\n"
для всех других «абзацев» (элементов@list
).источник
/usr/bin/sort
эту строку или этоawk
встроенная команда сортировки?Я написал инструмент на haskell, который позволяет вам использовать sort, shuf, tac или любую другую команду для абзацев текста.
https://gist.github.com/siers/01306a361c22f2de0122
РЕДАКТИРОВАТЬ: инструмент также включен в этот репо: https://github.com/siers/haskell-import-sort
Он разбивает текст на блоки, соединяет субблоки с
\0
символами, передает команду и, наконец, делает то же самое в обратном порядке.28-08-2015 : я нашел другое, личное использование для этого инструмента - выбор N абзацев после строки.
источник
Если у вас есть GNU awk, вы можете отсортировать каждый блок, используя встроенную
asort()
функцию. Что-то вроде этого:blocksort.awk
Запустите это так:
источник
TXR Lisp пошагово:
Ссылки: Get-линия , раздел * , оп , где , цепь , длина , zerop , MAPCAR , вставляет .
источник
[mapcar sort ...]
мы могли бы заменитьsort
функцию, которая передает строки через внешний процесс. Затем мы можем получить инструмент для распределения внешней команды обработки текста по абзацам.