awk 多行存储到变量中

awk multiple lines stored into variable

晚安,

我有一个格式如下的文件:

XXXXXXXXXXXYYYYYYYYAAAAAAAA
XXXXXXXXXXXIIIIIIII22222222
XXXXXXXXXXXOOOOOOOOPPPPPPPP
XXXXXXXXXXXAAAAAAAAKKKKKKKK
YYYYYYYYYYY22222222AAAAAAAA
YYYYYYYYYYY55555555BBBBBBBB
YYYYYYYYYYYGGGGGGGGKKKKKKKK
YYYYYYYYYYYQQQQQQQQ88888888

...等等。每 4 行第一部分 (X, Y, ...) 保持不变,其余部分发生变化。行与行之间没有分隔符,文件比较大

我想找到一种使用 awk 一次读取 4 行的方法,将它们存储在 4 个变量中 and/or 将 RS 设置为 \n,将 FS 设置为某物,因为我想在特定的 4 行中进行比较-blocks.And 能够在匹配项上输出所有 4 行

即,如果substr(17,3) == X输出你阅读的所有4条记录。

很抱歉没有提供代码,但我真的不知道如何用 awk 做到这一点。

给定一个特定的数字,即 Y=17,脚本将查找每条记录的给定子字符串。例如:

if (subst(11:2) == 17) then    # This can be a match on any line of a 4 grouping ( ie X... ) 
print (all 4 lines - All X...) - or print a given substring of those lines.

提供示例的实际示例

if (substr([=12=],21,2) == "PP") { print all 4 lines in memory }

...and it would print :

XXXXXXXXXXXYYYYYYYYAAAAAAAA
XXXXXXXXXXXIIIIIIII22222222
XXXXXXXXXXXOOOOOOOOPPPPPPPP
XXXXXXXXXXXAAAAAAAAKKKKKKKK

下面的简单脚本至少应该对您有所帮助。

awk 'substr([=10=],21,2) == "PP" { p=1 } # remember match
    NR % 4 { a[NR%4] = [=10=]; next }  # collect lines a[1] through a[3]
    # We have read four lines, and are ready to print if there was a match
    p { for (i=1; i<4; ++i) print a[i]; print [=10=];
        # reset for next iteration
        p=0 }' filename

第一个条件在所有输入行上测试。如果它们中的任何一个匹配,我们通过将标志变量 p 设置为 1 来记住这一点(任何 non-zero 都可以,真的)。条件也可以是正则表达式; /^.{20}PP/ 在第 21 个位置查找 "PP"。

第二个条件在不是 4 的倍数的行上触发。我们简单地收集这些行,并且(通过 next 语句)跳过脚本的其余部分。 (您可能知道,% 模运算符计算除法的余数;因此它从 1 到 3,然后循环 0、1、2,...)

因此,如果我们遇到第三个条件,则意味着我们处于行号可以被4整除的行;现在,条件检查 p 的值,如果它不为零,则执行操作。

(如果它为零,我们将失败而不打印任何内容,并且循环从 NR%4 等于 1 开始。)