Можно ли отсортировать две строки в большом файле?
Например, текущий файл имеет вид:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
И желаемый результат такой:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Здесь раздел HUT 03 VR Controls и HUT 04 Sports Control отсортирован.
В данном файле заголовки разделов начинаются с непробельных символов, а содержимое раздела всегда начинается с пробела или табуляции. Так как этот файл имеет более 100 разделов, то будет невозможно ввести название раздела в скрипте / команде.
Ответы:
В Python:
Это сортирует все разделы (отдельно), а не только те, которые находятся между двумя конкретными строками.
источник
Для удовольствия, вот способ сортировки одного раздела с помощью
ex
:источник
Используется
awk
для добавления числа (и разделителя табуляции) перед каждой строкой, соответствующей разделу, в котором находится эта строка. Для заголовков разделов мы добавляем число, за которым следует символ возврата на одну позицию (только потому, что возврат на заднюю панель сортируется перед вкладками). Затем мы просто сортируем полученные данные по этим числам, а затем удаляем их и добавляем разделители табуляции.Заголовки разделов определяются путем поиска непустых символов в начале строки.
источник
HUT
поля) в качестве префикса, чтобы сортировать разделы тоже.Вы можете получить
awk
иsort
сотрудничать, чтобы сделать работу.sort
close
наsort
когда часть маркера встречается; это приводитsort
к сбросу его вывода на стандартный вывод и выходаsort
вступает во владение для строк содержимого после маркера разделаclose
наsort
конце , чтобы заботиться о заднем содержанииисточник
Для таких задач мне часто бывает сложно написать сценарий. Если это нужно сделать только один раз и, возможно, для нескольких файлов, это можно сделать довольно просто, используя макрос, если вы откроете файл
vim
и наберете:GoFAKE SECTION<ESC>
: добавьте поддельный раздел в конце и убедитесь, что он находится в начале строки (вы можете включитьcindent
илиautoindent
включить). Это необходимо и для сортировки последнего раздела.gg
: назад перейти к началу файла, затем файл начинается с раздела перейти вниз на одну строку сj
qq
: начать запись макроса для регистрации qv
: начать выбор/^\S\+<Enter>
: поиск начала следующего разделаk
: вверх на одну строку:!sort<Enter
: сортировать разделnj
: перейти к первому элементу следующего разделаq
: остановить запись макроса@q
: повторить макрос100@@
: повторить макрос несколько раз (пока не останется ни одного раздела)dd
: удалить последнюю строку файла (theFAKE SECTION
)Вы можете
:set lazyredraw
ускорить выполнение макроса.источник