0

awkを使ってファイルを検索してみます。ファイルで検索するために、コマンドラインから変数を名前として読み取るようにawkに要求するにはどうすればよいですか?

これは私がファイルを検索するために使用する通常の方法であり、file.txtで検索する名前を入力するようにユーザーに求めることができます

awk -f myAwk.awk file.txt

どうすればこのように管理できますか:

awk -f myAwk.awk file.txt nameToSearch

ARGCとARGVを使用してfile.txtのnameToSearchを検索するにはどうすればよいですか?

4

3 に答える 3

3

あなたがおそらく探しているのは

awk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...]

それで

awk -v MYVAR=nameToSearch -v OTHERVAR=somethingElse -f myAwk.awk file.txt

それですか?もちろん、スイッチの順序(-f、-v)は重要ではありません。明らかに、awkプログラム自体の中に変数識別子のMYVAR(OTHERVAR)を含める必要があります。

于 2012-10-16T06:42:17.947 に答える
1

変数をawkに渡すには、-vコマンドを使用できます。例えば:

cat file.txt | awk -v p="stringToSearch" '$0 ~ p'

このコマンドで、touはstringToSearchをパターンに置き換えます(二重引用符を保持してください。スペースを保持するのに役立ちます)。awkコマンド$0 ~ pは、現在の行を指定されたパターンと比較します。

別のアプローチは、シェルからawkコマンドをビルドすることです。

p="stringToSearch"
awk "/$p/" file.txt

を強制的に展開するには、コマンドで二重引用符を使用する必要があります$p

于 2012-10-16T06:57:31.443 に答える
1

引数の順序を変更することが許可されている場合は、次のようにします。

awk -f myAwk.awk nameToSearch file.txt

次に、次のことができます。

awk 'NR==1 { nameToSearch = $0; next} { ... rest of myAwk.awk here ...}' nameToSearch file.txt

NR==1 {...}もちろん、ファイルの先頭にブロックを追加してmyAwk.awk、次を使用し続けることもできます。

awk -f myAwk.awk nameToSearch file.txt

Piotr Wadasが説明する手法には、同じ効果があります。

awk -v nameToSearch=whatever -f myAwk.awk file.txt

whateverスクリプトに追加の引数として渡すのではなく、それを自分で使用します。whatever追加の引数として渡すことは、-vファシリティがawkに追加される前にスクリプト作成者がしなければならなかったことです。記述-v nameToSearch=が冗長すぎる場合は、すべてをシェルスクリプトでまとめて、次のように言います。

myShellScript whatever file.txt

whateverしかし、あなたはawkスクリプトに追加の引数として渡すことによってそれを行う方法を尋ねたので、それが私が示したものです。

于 2012-10-16T06:59:23.147 に答える