2012-04-19 66 views
10

getline在下一行中讀取並將NR計數器增加1.在使用getline,awk後,繼續使用下一行。在大多數情況下,這是所需的行爲。查看下一行,但不要使用它

在我的特殊情況下,我只需要查看下一行,並根據其內容閱讀下一行,或者我需要回溯一行。

我該如何回溯awk中的一行?我試圖手動設置NR計數器到NR=NR-1但這不起作用。還是有沒有一種方法只看下一行而不改變NR

我需要向前看一行。在這種情況下,簡單地將該行保存在變量中並稍後參考該變量不起作用。我試圖在awk中實現一種識字編程工具,其中主文件可能包含許多子文件。這樣的子文件以類似於"% file:file1"的行開始。如果到達這樣的文件的末尾,如果具有較低縮進的行或到達具有諸如"% file:file2"的行的另一行。

當我已經用getline讀取這一行時,不會使用匹配/% file:/的所有行的規則集。這就是爲什麼我想重置NR到上一行,然後awk會再次讀取匹配/% file:/的行,並執行相應的規則。

+1

我開發了一種稱爲TXR的文本消除語言,它在面向行(「垂直」)和麪向字符(「水平」)匹配模式下都具有與隱式回溯相匹配的模式匹配。前視深度是任意數量的字符或線條。 TXR對於處理識字編程符號的任務幾乎是理想的。很難給出一個直接相關的例子;你能發佈完整的識字符號嗎? – Kaz 2012-04-19 20:42:37

回答

1

這是一個黑客位的,是相當昂貴的,但對於小文件確實給你一個前瞻:

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline 

這將需要NR的當前值,使用SED提取系NR + 1來自輸入文件。這是很昂貴的,因爲sed會在每次執行前瞻時讀取整個文件(可以通過向sed添加'q'命令稍微緩解這一點)。變量nextline將被設置爲文件的下一行,並且在最後一行將爲空白。

10

這可能會接近你要找的東西,不應該像sed解決方案那樣昂貴,因爲AWK會維護一個指向getline打開的文件的指針。

awk 'FNR == 1 { 
     getline nextline < FILENAME 
    } 
    { 
     getline nextline < FILENAME; 
     print "currentline is:", $0; 
     print "nextline is: ", nextline 
    }' input file 

第一個塊讀取第一行並浪費它。

在這種形式中,getline不設置任何變量,如NRFNRNF$0。它只設置你提供的變量(在這種情況下爲nextline)。

有關其他信息,請參見this

+0

慚愧,這看起來似乎是GNU awk特有的。 – 0xC0000022L 2014-05-16 00:57:33

+0

@ 0xC0000022L:它在'mawk'下適用於我。 – 2014-05-16 01:45:49

相關問題