Awk - 在匹配记录后打印下一条记录

ste*_*anB 4 awk

我在使用awk匹配字段后尝试获取下一个字段.

是否有选项可以执行此操作,还是需要将记录扫描到数组中然后检查数组中的每个字段并在此之后打印一个字段?

到目前为止我所拥有的:

文件格式为:

<FIELD><separator "1"><VALUE><separator "1"><FIELD><separator "1"><VALUE> 
Run Code Online (Sandbox Code Playgroud)

...等等,field|value重复对,将至少一对成对或多对<每行<10对

dat.txt:

FIELDA01VALUEA01FIELDA21VALUEA21FIELDA31VALUEA3
FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3
FIELDC01VALUEC01FIELDC21VALUEC21FIELDC31VALUEC3
FIELDD01VALUED01FIELDD21VALUED21FIELDD31VALUED3
FIELDE01VALUEE01FIELDE21VALUEE21FIELDE31VALUEE3
Run Code Online (Sandbox Code Playgroud)

使用简单的awk脚本在匹配FIELDB2的行上打印第二个字段:

#!/bin/awk -f

BEGIN { FS = "1" }
/FIELDB2/ { print $2 }
Run Code Online (Sandbox Code Playgroud)

运行以上:

> ./scrpt.awk dat.txt
Run Code Online (Sandbox Code Playgroud)

给我:

VALUEB0
Run Code Online (Sandbox Code Playgroud)

这是因为匹配的行:

FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3
Run Code Online (Sandbox Code Playgroud)

分成记录时:

FIELDB0 VALUEB0 FIELDB2 VALUEB2 FIELDB3 VALUEB3
Run Code Online (Sandbox Code Playgroud)

第二个字段来自哪个 VALUEB0

现在我不知道哪个FIELDXX会匹配,但我想在FIELDXX匹配后打印下一行的记录,在这个具体例子FIELDB2中我需要打印匹配VALUEB2.

有什么建议?

Chr*_*lay 7

您可以匹配该行,然后遍历字段以进行匹配,并打印下一条记录:

awk -F1 '/FIELDB2/ { for (x=1;x<=NF;x++) if ($x~"FIELDB2") print $(x+1) }' 
Run Code Online (Sandbox Code Playgroud)


Jot*_*tne 5

无需使用循环减慢速度:)

awk -F1 '/FIELDB2/ {f=NR} f&&NR-1==f' RS="1" file
VALUEB2
Run Code Online (Sandbox Code Playgroud)

  • 这就像一个魅力!不过你介意解释一下吗?我大多不明白这种情况下的顺序“f&amp;&amp;NR-1==f”,是这样的吗((NR-1)==f)&amp;&amp;f?我怀疑您使用 NR-1 来匹配 FIELDB2 ,因此让 NR 成为下一个字段,但我无法理解它是如何完成的以及关于匹配模式的 NR 和 f 的值是多少。先感谢您 (2认同)