【问题标题】:awk multiple lines stored into variableawk 多行存储到变量中
【发布时间】:2016-04-03 06:51:51
【问题描述】:

晚安,

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

XXXXXXXXXXXYYYYYYYYAAAAAAAA
XXXXXXXXXXXIIIIIIII22222222
XXXXXXXXXXXOOOOOOOOPPPPPPPP
XXXXXXXXXXXAAAAAAAAKKKKKKKK
YYYYYYYYYYY22222222AAAAAAAA
YYYYYYYYYYY55555555BBBBBBBB
YYYYYYYYYYYGGGGGGGGKKKKKKKK
YYYYYYYYYYYQQQQQQQQ88888888

... 等等。每 4 行,第一部分 (X, Y, ...) 保持不变,其余行更改。行与行之间没有分隔符,文件很大。

我想找到一种方法来使用 awk 一次读取 4 行,将它们存储在 4 个变量中和/或将 RS 设置为 \n 并将 FS 设置为某个值,因为我想具体进行比较4行块。并且能够在匹配中输出所有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($0,21,2) == "PP") { print all 4 lines in memory }

...and it would print :

XXXXXXXXXXXYYYYYYYYAAAAAAAA
XXXXXXXXXXXIIIIIIII22222222
XXXXXXXXXXXOOOOOOOOPPPPPPPP
XXXXXXXXXXXAAAAAAAAKKKKKKKK

【问题讨论】:

标签: awk multiline


【解决方案1】:

希望下面的简单脚本至少在开始时很有用。

awk 'substr($0,21,2) == "PP" { p=1 } # remember match
    NR % 4 { a[NR%4] = $0; 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 $0;
        # reset for next iteration
        p=0 }' filename

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

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

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

(如果它为零,我们不打印任何东西就失败了,循环从NR%4 等于 1 开始。)

【讨论】:

  • 不错!根据更新后的问题,您可能希望遍历这些值并与 17 或其他值进行字符串比较。
  • @fedorqui 根据您的建议进行了更新。在某些方面,我原来的答案更好;但希望这会有所帮助。
  • 嗯我真的不知道 OP 想要什么,但我会遍历 a[] 并检查每个元素上的 substr()for (...) if (substr ()) flag=1 然后打印完整块稍后,如果设置了标志。但是,再次,只是想知道这里的实际目标是什么。
  • 我提供了一个更好的输出示例,你的一点代码已经非常有用了,它只是对每组 4 个中的最后一个应用检查,我需要一种方法来为任何行实现它在给定的一组 4 中。对 awk 来说还是新手,如果这一切听起来很基础,请原谅我。
  • 再次更新。希望这有助于更多。
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2018-06-16
  • 2014-04-16
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多