2012-12-06 97 views
1

此命令打印:AWK - 執行字符串作爲命令?

$ echo "123456789" | awk '{ print substr ($1,1,4) }' 
1234 

是否可以執行字符串命令作爲?例如,下面的命令:

echo "123456789" | awk '{a="substr"; print a ($1,1,4) }' 

結果:

$ echo "123456789" | awk '{a="substr"; print a ($1,1,4) }' 
awk: {a="substr"; print a ($1,1,4) } 
awk:        ^syntax error 

編輯:

$ cat tst.awk 
function my_substr(x,y,z) { return substr(x,y,z) } 

{ a="my_substr"; print @a($1,1,4) } 
[email protected]:~/Pulpit$ echo "123456789" | gawk -f tst.awk 
gawk: tst.awk:3: { a="my_substr"; print @a($1,1,4) } 
gawk: tst.awk:3:      ^nieprawidłowy znak '@' w wyrażeniu 
[email protected]:~/Pulpit$ 
+1

但你爲什麼需要它? – Vijay

+0

我好奇地問 – Tedee12345

+1

它是一個很常見的事情,想定義一個泛型函數來迭代數組的所有元素,並對每個元素執行一些操作X,其中X根據調用而變化並且能夠分配函數名稱到X可以避免編寫一系列「if」或switch語句(gawk)。 –

回答

4

您可以通過在GNU變量調用用戶定義函數AWK使用間接函數調用,見http://www.gnu.org/software/gawk/manual/gawk.html#Indirect-Calls

$ cat tst.awk 
function foo() { print "foo() called" } 
function bar() { print "bar() called" } 

BEGIN { 
    the_func = "foo" 
    @the_func() 

    the_func = "bar" 
    @the_func() 
} 
$ gawk -f tst.awk 
foo() called 
bar() called 

不幸的是,由於內部實現的問題,如果你想調用的方式,那麼你需要的是內置功能寫一個包裝爲每個:

$ cat tst.awk 
function my_substr(x,y,z) { return substr(x,y,z) } 

{ a="my_substr"; print @a($1,1,4) } 
$ echo "123456789" | gawk -f tst.awk 
1234 
+0

你知道任何與POSIX awk類似的東西嗎? –

+0

不,沒有什麼像POSIX awk。 –

+0

@Ed Morton,最後一個例子不起作用。你可以再檢查一次嗎?謝謝。 – Tedee12345

4

我不認爲這是可以做到的,在AWK直接,但你可以通過使用shell獲得類似的效果。回想一下,awk程序是以字符串的形式給出的,並且字符串在shell中連接在一起,只需將它們並排寫入即可。因此,您可以這樣做:

a=substr 
echo "123456789" | awk '{ print '"$a"'($1, 1, 4) }' 

導致1234

+0

謝謝你的回答。 – Tedee12345