2009-11-19 46 views
4

我试图在使用awk匹配字段后得到下一个字段。Awk - 匹配记录后打印下一条记录

有没有这样做的选择,或者我需要将记录扫描到数组中,然后检查数组中的每个字段并打印之后的那个?

我到目前为止有:

的文件格式是:

<FIELD><separator "1"><VALUE><separator "1"><FIELD><separator "1"><VALUE> 

...等等,field|value双重复,在线路将至少有一对或多对< 10每行

dat.txt:

FIELDA01VALUEA01FIELDA21VALUEA21FIELDA31VALUEA3 
FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 
FIELDC01VALUEC01FIELDC21VALUEC21FIELDC31VALUEC3 
FIELDD01VALUED01FIELDD21VALUED21FIELDD31VALUED3 
FIELDE01VALUEE01FIELDE21VALUEE21FIELDE31VALUEE3 

随着简单的awk脚本它打印一行匹配FIELDB2第二场:

#!/bin/awk -f 

BEGIN { FS = "1" } 
/FIELDB2/ { print $2 } 

运行上面:

> ./scrpt.awk dat.txt 

给我:

VALUEB0 

这是因为相匹配的行:

FIELDB01VALUEB01FIELDB21VALUEB21FIELDB31VALUEB3 

当分成记录如下:

FIELDB0 VALUEB0 FIELDB2 VALUEB2 FIELDB3 VALUEB3 

从其中第二场是VALUEB0

现在我不知道哪个FIELDXX会一致,但我想FIELDXX匹配后打印就行了下一条记录,在这个特定的例子中,当FIELDB2匹配时,我需要打印VALUEB2

有什么建议吗?

回答

7

可以匹配行,然后在一个匹配的领域循环,并打印下一条记录:

awk -F1 '/FIELDB2/ { for (x=1;x<=NF;x++) if ($x~"FIELDB2") print $(x+1) }' 
2

无需使用循环:)

awk -F1 '/FIELDB2/ {f=NR} f&&NR-1==f' RS="1" file 
VALUEB2 
+0

速度变慢那奇迹般有效!你介意解释吗? 我大多不明白在这种情况下的顺序“f && NR-1 == f”,是这样((NR-1)== f)&& f? 我怀疑你使用NR-1来匹配FIELDB2,因此让NR成为下一个领域,但我不明白它是如何完成的,NR和f的值是什么关于匹配模式。先谢谢你 – laertis