首页 > 解决方案 > 分别从文本文件中处理具有特定模式边界的代码行?

问题描述

我已经使用这个脚本来提取名称 __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

标签: shellawk

解决方案


目前还不清楚您所说的“小组”或“过程”是什么意思,但希望至少这可以将您推向正确的方向。

假设您的组中没有空行,请在它们之间添加分隔符;然后循环空行之间的序列。你的 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 

推荐阅读