2016-08-01 59 views
7

會使用時$1$2 ...在END塊,像發生什麼:在AWK的END塊中定義了哪些字段?

awk '{print $3}END{print $1 $2}' 

我發現$1$2從最後一條記錄保留值。這種行爲是由標準保證還是針對具體實施?

+0

我會假設它是實現特定的。我在[spec](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html)中沒有看到任何內容,它直接指出字段變量在'END'塊中*未被清除。 – chepner

+0

我找不到特別指向這些字段的引用,但是許多其他變量(例如「NR」)指定爲處理最後一條記錄的值,因此將它擴展到字段並不瘋狂變量也是如此。 –

+1

它是特定於實現的。例如,請參閱HP-UX中的「$ 0」爲空。 [HP-UX上的awk的END塊行爲](http://stackoverflow.com/q/29970249/1983854) – fedorqui

回答

8

檢查我們看到docs這是實現特定

傳統,主要是因爲執行問題,$ 0和NF是 一個END規則中未定義。 POSIX標準規定NF在END規則中可用的爲 。它包含 最後輸入記錄中的字段數。很可能是由於疏忽,標準 並沒有說0美元也被保留下來,儘管從邏輯上來說 認爲它應該是。實際上,所有BWK awk,mawk和gawk 都保留了$ 0的值以供END規則使用。 然而,請注意, 一些其他的實現和許多舊版本的Unix awk不是

+0

正確。正如@fedorqui在他的評論[HP-UX awk](http://stackoverflow.com/questions/29970249/awks-end-block-behaviour-on-hp-ux)中指出的那樣,是一種不會在'END'部分保存'$ 0'等。我希望某人使用HP-UX進行測試的OPs腳本的解決方法,我希望是'awk'{print $ 3; last = $ 0} END {$ 0 = last;打印$ 1,$ 2}'' –

+0

@EdMorton,這將是有趣的檢查,因爲我很好奇,看看'$ 0'也建立在'END'。在我的GNU awk中它會執行'awk'END {$ 0 =「a b c」;打印$ 1}'文件',但是我不知道是否在所有awk版本中都會發生。 – fedorqui

+0

它**應該**工作,因爲POSIX說'分配給$ 0做不等於等於blah',而不是'賦值給$ 0不等於等於除非在END部分完成'但我想要從使用awk進行測試,該程序不會將'$ 0'保存到'END'部分。 –