パラメータをawkスクリプトファイルに渡したい場合、どうすればよいですか?
#!/usr/bin/awk -f
{print $1}
ここでは、シェルからスクリプトに渡された最初の引数を次のように出力します。
bash-Prompt> echo "test" | ./myawkscript.awk hello
bash-Prompt> hello
あなたのハッシュバンは、スクリプトがシェルスクリプトではなく、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スクリプトで処理する必要があります。
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
-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