Как сортировать разделы файла в зависимости от 4-го значения 1-й строки каждого раздела?

К сожалению, эта информация отсутствует на справочных страницах, и даже зная, как их читать, (см. ниже )вы столкнетесь с трудностями при попытке найти эту информацию.

Тем не менее, красота открытого исходного кода зависит от возможности читать исходный код. Если вы посмотрите наudev-builtin.cисходный файл в репозитории systemd/ udevи имеете базовые знания языка C , вы найдете следующий фрагмент кода :Структура, которая отображает все существующие встроенные типы.

static const struct udev_builtin *builtins[_UDEV_BUILTIN_MAX] = {
#if HAVE_BLKID
        [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
#endif
        [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
        [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
        [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
        [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
#if HAVE_KMOD
        [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod,
#endif
        [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id,
        [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link,
        [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id,
        [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id,
#if HAVE_ACL
        [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess,
#endif
};

Этот structсодержит все встроенные -типы и сопоставляет исходные файлы в зависимости от типа. Пример:

Похожие:

0
06.02.2021, 01:46
2 ответа

С любым awk, sort и cut:

$ awk -v OFS='\t' '!pNF{val=$4} {print val, NR, $0; pNF=NF} END{if (pNF) print val, NR+1, ""}' file |
    sort -k1,1n -k2,2n |
    cut -f3-
PT2 energy =  6.552 eV ( -459.6143027 au) ( 52841.3 cm-1) (R=6)
222u20d0 4->7 : -0.612 (0.374)
2222ud00 5->6 : -0.499 (0.249)
222udud0 4,5-->6,7 : -0.271 (0.074)
R=6  TDM-form-state 1=  -0.2916   -0.0544  -2.1475 TDM= 2.17  f: 0.754

PT2 energy =  7.018 eV ( -459.5971543 au) ( 56605.0 cm-1) (R=5)
22u220d0 3->7 : -0.396 (0.156)
222u2d00 4->6 :  0.352 (0.124)
22220ud0 5-->6,7 :  0.326 (0.106)
2222u0d0 5->7 :  0.303 (0.092)
2222u00d 5->8 :  0.271 (0.073)
222ud020 4,5-->7 :  0.267 (0.071)
22u22d00 3->6 : -0.229 (0.052)
R=5  TDM-form-state 1=   0.0860   -0.1785  -0.5446 TDM= 0.58  f: 0.058

PT2 energy =  7.135 eV ( -459.5928710 au) ( 57545.0 cm-1) (R=4)
22u22d00 3->6 : -0.535 (0.286)
22202200 4-->6 : -0.344 (0.119)
222u200d 4->8 :  0.256 (0.065)
222u2d00 4->6 : -0.254 (0.065)
R=4  TDM-form-state 1=   0.2702   -0.2855  -0.5610 TDM= 0.69  f: 0.082

В противном случае используйте только GNU awk для массивов массивов и отсортируйте _в:

awk '
    BEGIN { RS=""; ORS="\n\n" }
    { recs[$4][++cnt[$4]] = $0 }
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (val in recs) {
            for (i=1; i<=cnt[val]; i++) {
                print recs[val][i]
            }
        }
    }
' file

Цикл на cnt[]таков, что если/когда одно и то же значение (, например.7.135)появляется несколько раз в 4-м поле для разных входных записей, вывод сохранит порядок ввода для этого значения ключа. В качестве альтернативы вы можете получить тот же результат с конкатенацией строк при чтении ввода, например. все еще использую GNU awk для сортировки _в:

awk '
    BEGIN { RS=""; ORS="\n\n" }
    { recs[$4] = recs[$4] $0 ORS }
    END {
        PROCINFO["sorted_in"] = "@ind_num_asc"
        for (val in recs) {
            printf "%s", recs[val]
        }
    }
' file

Недостаток подхода -только с gawk заключается в том, что они должны хранить весь файл в памяти и не переносятся на системы без gawk. Сценарий awk+sort+cut в верхней части является легко переносимым, и только «сортировка» должна иметь дело со всем файлом сразу, и он предназначен для использования пейджинга по запросу -и т. д. для обработки больших файлов и поэтому гораздо менее вероятен. иметь проблемы с огромным файлом, чем gawk.

3
18.03.2021, 22:32

sortориентирован по линии -. Здесь нужно прочитать файл в «абзацах».

Это можно сделать с помощью очень короткой программы GNU awk:

gawk -v RS= -v ORS='\n\n' '
  {section[$4] = $0}
  END {
    PROCINFO["sorted_in"] = "@ind_num_asc"
    for (key in section) print section[key]
  }
' file

Установка переменной RS (разделителя записей )на пустую строку считывает файл с пустыми -записями, разделенными строками. Каждая запись хранится в массиве, индексированном по ключу сортировки.

Волшебная строка PROCINFO указывает gawk сортировать массив численно по индексу во время обхода.

2
18.03.2021, 22:32

Теги

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