簡體   English   中英

AWK參數與文件

[英]AWK arguments vs file

假設我有兩段代碼:

awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}} {print "So as you can see, complications can occur."} ' one two three four

除非目錄中有一個名為“ one的文件,否則這部分內容將無法工作。

awk ' BEGIN {for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]}}' one two three four

這將正常工作,並且one two three four將被理解為參數。 那么,為什么前者不起作用? 是什么讓awk認為文件中有某些內容而參數中有某些內容? 謝謝。

在運行任何BEGIN塊之后,如果還有任何剩余代碼,則它在輸入的每一行中運行一次-這意味着awk必須讀取其輸入。 如果awk去讀取輸入時ARGV有任何內容,它將被解釋為要打開和讀取的文件的列表; 否則,將改為讀取標准輸入。

在您的例子中, print是提到並發症行不是內部BEGIN塊,所以它不會被運行,直到awk讀取輸入行-它會嘗試從文件做one ,因為它的第一個參數。

如果要將參數傳遞給AWK程序而不將其視為文件名,則可以; 如果您在BEGIN塊之外也有任何代碼,請確保不要將它們留在ARGV

awk 'BEGIN {
       for (i=0; i<ARGC-1; i++) {printf "ARGV[%d] = %s\n", i, ARGV[i]};
       delete ARGV} 
     {print "So as you can see, complications can occur."}' one two three four

上面將打印出消息,然后在標准輸入上等待一行。 收到任何行后,它將打印出有關並發症的消息。

如果您只希望AWK程序執行其工作而不嘗試讀取和處理任何輸入-撇開AWK可能是該情況的一個奇怪選擇-只需將所有代碼放入一個或多個BEGIN塊中即可。 如果awk完成了BEGIN塊並沒有找到其他代碼,它將退出而不嘗試讀取任何輸入。

awk需要有效的輸入數據(來自文件或標准輸入)來執行BEGIN塊之外的代碼。 在第一個代碼段中,您在BEGIN之外有一條print語句,如果給awk一些有效的輸入(即使為空),該語句也會執行。 但是,如果您的輸入文件不存在,則awk將返回此錯誤:

fatal: cannot open file `one' for reading (No such file or directory)

第二個代碼段在沒有有效輸入的情況下有效,因為您只有BEGIN塊內有代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM