2013-02-10 49 views
0

採樣功能:awk中如何傳遞參數的功能,從內AWK稱爲

$ testfn() { echo "${1} world"; } 
$ testfn hello 
hello world 

AWK例如:

$ echo "something bla bla2"|awk '$1 ~/something/ { print $0; }' 
something bla bla2 

現在我想改變「什麼」,以使用創造「的東西的世界」以上功能,在打印整行時,通過傳遞第一個awk「列元素」作爲參數:

$ echo "something bla bla2"|awk '$1 ~/something/ { $1="'"$(testfn) $1"'" ; print $0 }' 
world bla bla2 

^^以上不起作用

是否有任何方法將參數從awk傳遞給awk中的函數?

+0

第二個塊中的awk示例僅打印「某物bla bla2」,它不打印「something」的第一行。這是一個錯字還是別的嗎?這是什麼操作系統,你使用的是什麼版本的awk/gawk? – slm 2013-02-10 06:45:06

+0

錯字,糾正它。它是RHEL5。 – hellish 2013-02-10 18:44:46

回答

0

不 - 您不能從awk以內調用shell函數。它不是殼。但是,常見的解決方法是將函數添加到文件並使用awk的system()函數調用它。這裏有一個簡單的例子:

內容的yourfunction.sh

{ 
    echo "$1 world" 
} 

然後運行:

echo "what the ..." | awk '{ system("./yourfunction.sh" FS $1) }' 

結果:

what world 

請注意,如果你發現自己有這樣做,幾乎肯定會有更好的方法。你在做什麼其實想在這裏做?


編輯:

針對下面的評論,請使用getline()功能:

echo "what the ..." | awk '{ "./yourfunction.sh" FS $1 | getline $1 }1' 

結果:

what world the ... 

這裏重新的getline()功能的一些信息:

http://www.gnu.org/software/gawk/manual/html_node/Getline.html

+0

謝謝!如果我找不到其他方法來實現我想要的功能,則必須嘗試此解決方法。 – hellish 2013-02-10 19:24:39

+0

嘿,但這個執行功能和顯示輸出,我試圖實現的是取代拳頭元素,然後打印整個修改後的行。 $回聲「什麼...「| awk'{$ 1 = system(」./ yourfunction.sh「FS $ 1); print;}' 什麼世界 0; ...我期待這裏的結果是一行:」什麼世界.. 。「 – hellish 2013-02-10 23:24:18

+0

@hellish:請參閱我上面編輯的編輯器HTH。 – Steve 2013-02-10 23:53:05

1

高度不推薦的,但是:

$ cat .env 
testfn() { echo "${1} world"; } 
$ echo $BASH_ENV 
.env 
$ echo "something bla bla2" | awk '$1 ~/something/{"bash -c \"testfn " $1 "\"" | getline $1; print $0}' 
something world bla bla2 

現在,告訴我們你真的是在努力做的,我們可以幫你寫一個健全的腳本來做到這一點。

+0

盡你所能描述了一切但是出錯: BASH_ENV = .env $ echo「something bla bla2」| awk'$ 1〜/ something/{「bash -c \」testfn「$ 1」 \「」| getline $ 1; print $ 0}' sh:-c:line 0:尋找匹配的意外EOF''' sh:-c:第一行:語法錯誤:文件意外結束 bla bla2 我向awk發送一個值表。我想要的是根據第1列中的元素替換第5列中的一個字段,並且應該通過複雜函數(基於來自數據庫的SQL查詢結果)處理此元素。 – hellish 2013-02-10 18:58:17

+0

也許你的外殼不是bash和/或bash不可用在你的盒子上?只需使用通常使用的任何shell,並在啓動新的非登錄shell時執行shell的任何文件。無論如何你不應該這樣做。不幸的是,您的解釋並不包含足夠的信息來幫助您編寫腳本。如果您需要幫助,請使用示例輸入/輸出編輯您的問題,並描述您的功能應該執行的操作。 – 2013-02-10 19:43:01