2009-11-19 47 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