Сортировка раздела файла

Actualizar el paquete grub2 -2.02 -0.64.el7.x86 _64 a la siguiente versión que es la 0.65

8
16.05.2019, 12:47
5 ответов

В Питоне:

#!/usr/bin/python3

with open("file.txt", "r") as ins:
    lines = []
    for line in ins:
        if line.startswith((" ", "\t")):
            lines.append(line)
        else:
            lines.sort()
            print(*lines, end = "", sep = "")
            print(line, end = "")
            lines = []
    lines.sort()
    print(*lines, end = "", sep = "")

Это сортирует все разделы (отдельно ), а не только разделы между двумя конкретными строками.

7
27.01.2020, 20:08

Вот способ отсортировать отдельный раздел с помощьюex:

ex file <<%
/HUT
+1,/HUT/-1!sort
w file.sorted
q
%
6
27.01.2020, 20:08
$ awk 'BEGIN { OFS="\t"; s=0 } /^[^[:blank:]]/ { print ++s "\b", $0; next } { print s, $0 }' file | sort -n | cut -f 2-
    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

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

Заголовки разделов обнаруживаются путем поиска не -пустых символов в начале строки.

6
27.01.2020, 20:08

Вы можете заставить awkи sortсотрудничать, чтобы выполнить работу.

awk '
    /^[[:blank:]]/{print | "sort"; next}
    {close("sort"); print}; 
    END{close("sort")}
' file
  • Направить каждую строку содержимого вsort
  • Вызовите closeна sort, когда встречается маркер раздела; это приводит к тому, что sortсбрасывает свой вывод на стандартный вывод и выходит
  • Печать маркера раздела
  • Новый экземпляр sortзаменяет строки содержимого, следующие за маркером раздела
  • Позвоните closeна sortв конце, чтобы позаботиться о конечном содержимом
3
27.01.2020, 20:08

Для таких задач мне часто бывает утомительно писать сценарий. Если это нужно сделать только один раз и, возможно, для нескольких файлов, это можно сделать с помощью макроса, если вы откроете файл в vimи наберете:

  • GoFAKE SECTION<ESC>:добавьте поддельный раздел в конце и убедитесь, что он находится в начале строки (возможно, у вас включен cindentили autoindent). Это также необходимо для сортировки последнего раздела.
  • gg:вернуться к началу файла,затем файл начинается с раздела, идущего вниз на одну строку сj
  • qq:начать запись макроса в регистр q
  • v:выбор начала
  • /^\S\+<Enter>:поиск начала следующего раздела
  • k:вверх на одну строку
  • :!sort<Enter:отсортировать раздел
  • nj:перейти к первому элементу следующего раздела
  • q:остановить запись макроса
  • @q:повторить макрос
  • 100@@:повторить макрос несколько раз (до тех пор, пока не останется разделов)
  • dd:удалить последнюю строку файла (FAKE SECTION)

Возможно, вы захотите :set lazyredrawускорить выполнение макроса.

1
27.01.2020, 20:08

Теги

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