web-dev-qa-db-ja.com

awkスクリプトファイルにパラメーターを渡す

パラメータをawkスクリプトファイルに渡したい場合、どうすればよいですか?

#!/usr/bin/awk -f

{print $1}

ここでは、シェルからスクリプトに渡された最初の引数を次のように出力します。

bash-Prompt> echo "test" | ./myawkscript.awk hello
bash-Prompt> hello
29
Mahmoud Emam

あなたのハッシュバンは、スクリプトがシェルスクリプトではなく、awkスクリプトであると定義しています。スクリプト内でbash方式で実行することはできません。

また、あなたがしたこと:echo blah|awk ...notパラメータを渡すことで、echoコマンドの出力を別のコマンドにパイプします。

以下の方法で試すことができます:

 echo "hello"|./foo.awk file -

または

var="hello"
awk -v a="$var" -f foo.awk file

これにより、foo.awkにvar aがあり、それを使用できます。

シェルスクリプトが$ 1 $ 2 varsを受け入れるようなことをしたい場合は、小さなシェルスクリプトを作成してawkをラップできます。

[〜#〜] edit [〜#〜]

いいえ、私はあなたを誤解しませんでした。

例を見てみましょう:

たとえば、x.awkには次のものがあります。

{print $1}

もしあなたがそうするなら :

echo "foo" | x.awk file

以下と同じです:

echo "foo"| awk '{print $1}' file

ここでは、awkの入力はfileのみであり、エコーfooは意味をなしません。もしあなたがそうするなら:

  echo "foo"|awk '{print $1}' file -
or
    echo "foo"|awk '{print $1}' - file

awkは2つの入力(awkの引数)を取ります。1つは標準入力、もう1つはファイルです。awkスクリプトでは次のことができます。

echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file

これは最初にエコーからfooを出力し、次にfileからのcolumn1は実際の作業を行わず、すべてを出力します。

もちろん、3つ以上の入力を持つことができ、NRとFNRをチェックしないでください。

ARGC   The number of elements in the ARGV array.

ARGV   An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1

例えば ​​:

echo "foo"|./x.awk file1 - file2

あなたの "foo"は2番目の引数です。x.awkでARGV[2]で取得できます

echo "foo" |x.awk file1 file2 file2 -

現在はARGV [4]のケースです。

つまり、あなたのecho "foo"|..はawkの標準入力であり、1番目またはn番目の「引数」/ awkの入力までになります。 -(stdin)を置く場所に依存します。 awkスクリプトで処理する必要があります。

15
Kent

awk$1は、bashのような最初の引数ではなく、レコードの最初のフィールドを参照します。これにはARGVを使用する必要があります。公式のWordについては、hereを確認してください。

スクリプト:

#!/bin/awk -f

BEGIN{
    print "AWK Script"
    print ARGV[1]
}

デモ:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
52
Chris Seymour

-vコマンドラインオプション として使用して、スクリプトに変数を提供できます。

次のようなファイルscript.awkがあるとします。

BEGIN {print "I got the var:", my_var}

次に、次のように実行します。

$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me
25
fedorqui