2017-03-26 22 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

すっごく寂しかった、それはシェル機能です。下記の答えを参照してください。 – Dan

答えて

6

あなたはawkからシェル関数を呼び出すことはできません。 同等のawk関数を書く必要があります。あなたのawkスクリプトにこれを追加します。

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

いいですね、私は代わりの答えとして私の提案を投稿しました。 nが正であることを確認するためにあなたのものを微調整したいかもしれません - 負の数で呼び出された場合、それは無限ループに近づきます。そのようなループをしっかりと使って連続したドット(文字列自体を印刷するのではなく、このような関数の通常のユースケース)を作成するには、 'function dots(n、x){while n - > 0)x = x "。 return x} '。 –

+0

すばらしい答え。 1つのニト;これをあなたのawkスクリプトの先頭に置いてください。... awkはスクリプト全体をスキャンするので、関数はプログラムのルール間のどこにでも現れることができます。 [関数のすべての使用の前に関数の定義を入れる必要はありません。](https://www.gnu.org/software/gawk/manual/html_node/Definition-Syntax.html#Definition-Syntax) – dawg

+1

@dawgあなたの洞察力のある発言をありがとう、私はそれに応じて私の答えを変更しました。 – Jens

1

方法を効率的にn個のドットの文字列を作成するために、awkは上記gensub()のためにGNU AWKを使用しています

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

あると、あなたが使用することができ、他のawksで変数とGSUB():すべての.が、その後/ /,".\n"/ /,"."を変更した後、あなたが本当に改行をしたいん万一

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

関連する問題