23

内部から現在のシェルに変数を設定する方法はありますawkか?

ファイルに対して何らかの処理を行い、データを出力したいと考えています。ファイル全体を読み通すので、行数を節約したいと思います。この場合はFNR.

FNRシェル変数に値を設定する方法が見つからないようですが、起こります。そうでない場合はFNR、出力ファイルから を読み取って、たとえばnum_linesFNR値で設定する必要があります。

を使用していくつかの組み合わせを試しましawk 'END{system(...)}'たが、うまく機能しませんでした。これを回避する方法はありますか?

4

7 に答える 7

33

ここに別の方法があります。

これは、変数の値を1 つの変数にまとめており、それらを分割したい場合に特に便利です。たとえば、変数を作成したいデータベースの単一行からの値のリストがあるとします。

val="hello|beautiful|world" # assume this string comes from a database query
read a b c <<< $( echo ${val} | awk -F"|" '{print $1" "$2" "$3}' )

echo $a #hello
echo $b #beautiful
echo $c #world

read コマンドはパイプから読み取るのではなく、stdin から読み取るため、「here 文字列」、つまり <<< が必要です。

于 2014-12-17T09:17:32.590 に答える
31
$ echo "$var"

$ declare $( awk 'BEGIN{print "var=17"}' )
$ echo "$var"
17

evalの代わりにdeclareを使用する必要がある理由は次のとおりです。

$ eval $( awk 'BEGIN{print "echo \"removing all of your files, ha ha ha....\""}' )
removing all of your files, ha ha ha....

$ declare $( awk 'BEGIN{print "echo \"removing all of your files\""}' )
bash: declare: `"removing': not a valid identifier
bash: declare: `files"': not a valid identifier

最初のケースでは、evalがawkが出力する文字列を実行することに注意してください。これは、誤って非常に悪いことになる可能性があります。

于 2013-01-24T16:09:59.900 に答える
6

サブシェルからその親シェルに変数をエクスポートすることはできません。ただし、他にも次のような選択肢があります。

  1. AWK を使用してファイルの別のパスを作成してレコードをカウントし、コマンド置換を使用して結果を取得します。例えば:

    FNR=$(awk 'END {print FNR}' filename)
    
  2. サブシェルでFNRを出力し、他のプロセスで出力を解析します。
  3. FNRが回線数と同じ場合は、コールwc -l < filenameしてカウントを取得できます。
于 2013-01-24T15:41:42.863 に答える
1

awk割り当てステートメントを印刷します。

MYVAR=NewValue

次に、シェルスクリプトで、スクリプトevalの出力は次のようになりawkます。

eval $(awk ....)
# then use $MYVAR

編集:割り当て以外のものが内部スクリプトによって出力される場合にエラーが発生しにくくするために、declareの代わりにを使用することをお勧めします。evalこれはbashのみですが、シェルbashであり、スクリプトが#!/bin/bashこの依存関係を正しく記述している場合は問題ありません。

eval $(...)バリアントは広く使用されており、既存のプログラムは適切であるが適切ではない出力を生成します(evaldeclareですlesspipe)。そのため、それを理解することが重要であり、bashのみのバリアントは「ローカライズされすぎています」。

于 2013-01-24T15:38:23.097 に答える