0

サンプル関数:

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

awk の例:

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

上記の関数を使用して「something」を「something world」に変更したいのですが、最初の awk " column element" をパラメーターとして渡すことで、行全体として印刷するときに:

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

^^ 上記は動作しません

awk から awk 内の関数にパラメーターを渡す方法はありますか?

4

2 に答える 2

2

強くお勧めしませんが:

$ 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

では、あなたが本当にやろうとしていることを教えてください。それを実行するための適切なスクリプトを作成するお手伝いをします。

于 2013-02-10T14:06:08.887 に答える
1

いいえ-の内部からシェル関数を呼び出すことはできませんawk。シェルではありません。ただし、一般的な回避策には、関数をファイルに追加し、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

于 2013-02-10T08:16:02.987 に答える