Обрабатывать строки кода с определенной границей шаблона из текстового файла отдельно? - PullRequest
0 голосов
/ 09 января 2019

Я использовал этот скрипт для извлечения всех вхождений функциональных данных между именем __libc_memalign и: из «file1» в «file 2». Теперь файл 2 содержит несколько (6000 групп) вхождений кода с этим шаблоном. Как я могу перебрать каждую группу в файле "file2" и обработать каждую группу?

`awk '/__libc_memalign/ {p=1;print;next}  /:/ && p {p=0;print} p' file1.out >file2`

пример ввода

        0   0xc40840    :   __libc_memalign
    0   0x40bac0    0x7ffe493d0d50  W
    0   0x40bac2    0x7ffe493d0d48  W
    0   0x40bac4    0x7ffe493d0d40  W
..
     0  0xc40840    :   __libc_memalign
        0   0x40bac0    0x7ffe493d0d50  R
        0   0x40bac2    0x7ffe493d0d48  R
        0   0x40bac4    0x7ffe493d0d40  R
....
    0   0xc40840    :   __libc_memalign
        0   0x40bab0    0x7ffe493b0d50  W
        0   0x40bab2    0x7ffe493dbd48  R
        0   0x40bac4    0x7ffe493d0d40  W

1 Ответ

0 голосов
/ 09 января 2019

Не совсем понятно, что вы подразумеваете под «группой» или «процессом», но, надеюсь, по крайней мере, это может подтолкнуть вас в правильном направлении.

Если в ваших группах нет пустых строк, добавьте разделитель между ними; затем переберите последовательности между пустыми строками. Ваш скрипт Awk уже, кажется, ставит пустую строку, когда заканчивает группу, поэтому вы можете просто

awk '/__libc_memalign/ {p=1; print; next}
    /:/ && p {p=0; print} p' file1.out |
while true; do
    while read -r line; do
        case $line in '') break;; esac
        echo "$line"
    done |
    # Pipe the collected group into "process
    process
done

Это довольно неуклюже и, вероятно, может быть значительно переработано. Если вам не нужны промежуточные результаты, может быть просто

awk '/__libc_memalign/ {
        p=1; cmd = "process" print | cmd; next}
    /:/ && p { p=0; close(cmd) }
    p { print | cmd }' file1.out 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...