2017-03-26 25 views
1

我在程序中遇到了一個問題。我正在使用awk,我正試圖調用它的一個函數。awk中的調用函數

function dots() 
{ 
    for ((i= 0 ; i < $1; i++)); do 
     echo "." 
    done 
} 


awk '{k=$1; sub(/[^ ]+ /,"__",$0); $1=$1; print $0 "\t:", (dots k) }' 

然後我嘗試調用函數,並傳遞k作爲第一個參數(k是一個數字)。有沒有辦法在awk中調用函數?

+0

你有沒有嘗試括號,如下所示:'dots(k)'? – Dan

+0

是的,它不起作用 – Adam

+0

糟糕,完全錯過了,這是一個shell函數。請參閱Jens以下的答案。 – Dan

回答

6

你只是不能從awk調用shell函數。 您必須編寫一個等效的awk函數,例如添加到您的awk腳本:

function dots(n) {while(n-- > 0) print "."} 
+0

聽起來不錯,我張貼我的建議作爲替代答案。你可能想調整你的檢查n是積極的 - 如果它被稱爲一個負數,它會分離成[近]無限循環。爲了強有力地使用一個循環來創建一串連續的點(這是一個像這樣的函數的正常使用情況,而不是讓它打印字符串本身)將會像'function dots(n,x){while( n - > 0)x = x「。」; return x}'。 –

+0

很棒的回答。一個尼特:例如將它放置在awk腳本的頂部......由於awk會對整個腳本進行預處理,因此該函數可以出現在程序規則之間的任何位置。 [在函數的所有使用之前,不需要定義函數。](https://www.gnu.org/software/gawk/manual/html_node/Definition-Syntax.html#Definition-Syntax) – dawg

+1

@dawg感謝您的深刻評論,我相應地修改了我的答案。 – Jens

1

的方式有效地創建n個點的字符串使用awk是

function dots(n) { return gensub(/ /,".","g",sprintf("%*s",n,"")) } 

以上使用GNU AWK的gensub(),你可以使用其他awks變量和GSUB():

function dots(n, x) { x=sprintf("%*s",n,""); gsub(/ /,".",x); return x } 

在你真的希望每個.後換行然後換/ /,"."/ /,".\n"萬一。