2013-03-25 143 views
0

我環顧了一會兒,發現只有觸及主題的問題或者提供了一個不起作用的答案。這裏的問題:在awk中接受命令行參數

我正在爲學校的任務,需要我閱讀awk腳本的命令行參數(這似乎奇怪開始,但呃)。我們使用的是舊版本的Unix,我正在運行Bash。這個awk只有-f和-Fc選項。基本上,我一直試圖做「awk -f awk_script arg1 arg2 arg3 arg4 arg5 arg6」,但每次awk嘗試打開arg1作爲文件,事實並非如此。我看到一個例子在其他地方解決,這是:

awk 'BEGIN { print "ARGV[1] = ", ARGV[1] }' foo bar 

它應該打印「foo」的,但在這個系統上我只得到輸出「ARGV [1] = AWK:無法打開富」。總而言之,有沒有辦法解決這個問題?可以awk這個舊的讀取命令行參數,並將它們用於除輸入文件以外的其他任何內容?教官筆記文件暗示上述用法(印刷foo),但他的程序甚至不運行,所以...

任何幫助將不勝感激。

編輯後:使用的SunOS 5.10和這個awk不支持-v選項,只有-f和-FC

+0

它可能是關於你的操作系統和awk版本的問題,因爲......「對我來說「;-)'$ awk'BEGIN {print」ARGV [1] =「ARGV [1]}'abc' - 輸出 - >'argv [1] = a'。編輯你的問題以包含'uname -a'和'awk --version'的輸出。祝你好運。 (你可能沒有得到--version的響應,那麼你的awk是非常原始的設備; - ) – shellter 2013-03-25 22:48:58

+0

哈哈我沒有得到awk的回覆--version – WannabeCoder 2013-03-25 23:04:27

+1

給定了SunOS 5.1,你使用的awk是「舊的「〜1977年的awk。嘗試將您調用的名稱更改爲'nawk'。 (新的awk)。這本由awk的作者編寫的The Awk Programming Language的書是關於「新」awk的,並於1988年出版,但仍然極力推薦。 '有效的Awk編程'(2001)也很棒,涵蓋了許多對gawk(gnu-awk)的增強。祝你好運。 – shellter 2013-03-26 00:43:08

回答

0

使用nawk/usr/xpg4/bin/awk。這些是支持更多功能的更新版本的awk。

或者,您可以安裝另一個版本的awk,如mawk或GNU awk。

+0

我將命令從「awk ....」切換到「nawk ...」,即使沒有-v選項,一切正常(足夠緊密),完全符合我的要求。感謝工作解決方案,但我仍然想知道爲什麼awk不能正常工作。 – WannabeCoder 2013-03-25 23:19:59

+2

由於nawk較舊,非POSIX且功能較少,因此應在Solaris上使用/ usr/xpg4/bin/awk而不要使用nawk。 – 2013-03-26 00:49:45

+0

@EdMorton是的,/ usr/xpg4/bin版本更好,但在最小安裝時可能無法使用。我列出了多種可能性。 – jilles 2013-03-30 11:43:13

0

一個可能的解決辦法 - 也許不能接受的 - 是使用的-v選項awk

awk -v arg1=foo 'BEGIN { print arg1; }' 
+0

這個版本的awk不支持-v選項(它看起來像awk可以獲得的那樣簡單)。 – WannabeCoder 2013-03-25 23:10:51

+0

@WannabeCoder然後,你使用的'awk'版本是垃圾,你應該使用不同的。 '-v'選項由POSIX指定。不支持它的實現不能合法地聲稱是awk。 – 2017-08-16 05:58:28

1

您可以閱讀參數之後遞減ARGC所以只有第一個(或多個)由awk視爲輸入文件(縣)的說法(S)爲(是):

#!/bin/awk -f 

BEGIN { 
    for (i=ARGC; i>2; i--) { 
     print ARGV[ARGC-1]; 
     ARGC--; 
    } 
} 
… 

或者,您可以重置ARGC後讀取所有參數:

#!/bin/awk -f 

BEGIN { 
    for (i=0; i<ARGC; i++) { 
     print ARGV[ARGC-1]; 
    } 
    ARGC=2; 
} 
… 

兩種方法都正確處理myawkscript.awk foobar foo bar …彷彿foobar的是唯一的文件處理(當然你也可以設置ARGC 3,如果你想在兩個第一論據,文件等)。在你的特定情況下,你似乎不想處理任何文件,所以你可以設置ARGC爲1.