我正在尝试使用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
。
有什么建议吗?
答案 0 :(得分:7)
您可以匹配该行,然后遍历字段以进行匹配,并打印下一条记录:
awk -F1 '/FIELDB2/ { for (x=1;x<=NF;x++) if ($x~"FIELDB2") print $(x+1) }'
答案 1 :(得分:2)
不需要使用循环减慢速度:)
awk -F1 '/FIELDB2/ {f=NR} f&&NR-1==f' RS="1" file
VALUEB2