シェルスクリプトでawkと変数を使用する

シェルスクリプトでawkと変数を使用する

次のような「random」というファイルがあります。

A B C D
A B C D
A B C D

このシェルスクリプトに2番目の列を印刷させるにはどうすればよいですか?

#! /usr/bin/tcsh -f

set variable = "2"
awk '{print "$""'"$variable"'" }' random

それは以下を提供します:

$2
$2
$2
$2
$2

$ 2を次のようにハードコードすると:

#! /usr/bin/tcsh -f

awk '{print $2 }' random

わかりました。

B
B
B

ただし、毎回異なる値を設定する必要があるため、ハードコーディングはオプションではありません。

答え1

awkのoptionsを使用して変数をawkに渡します-v。たとえば、awk変数をncsh変数と同じ値に設定します$variable

% set variable=2
% awk -v n="$variable" '{print $n}' random
B
B
B

または、スクリプトの後に変数の代入を引数として渡します(awkは引数をx=yファイル名ではなく代入として解釈します)。

% set variable=4
% awk '{print $n}' n="$variable" random
D
D
D

どちらの場合も、awkスクリプトはそれを$n「フィールド番号n」と解釈します。

あるいは、環境変数を使用することもできます。 awkは配列を介してアクセスできますENVIRON。例えば

% setenv variable 2
% awk '{print $ENVIRON["variable"]}' random
B
B
B

ところで、他の人がコメントで述べたように、csh/tcshスクリプト言語では良い選択ではありません。シェルスクリプトを作成するには、Bourne などのシェルを使用します。 tcshインタラクティブシェルはまだ大丈夫ですが、他のシェルがまだ提供していないものは提供しません。 cshは1980年代には優れたインタラクティブシェルでしたが、他のシェルは長い間これを上回りました(そしてcshには欠点もあります。 kshまたはzshに切り替えてみてください。

答え2

(t)cshのすべての欠点を覚えているわけではありませんが、POSIXに似たシェルで動作する方法と似ているとします。'{print "$""'二重引用符を含む引用符付き文字列があり、次に引用符付き"$variable"変数拡張子があります'" }'。 awkが得ることは、{print "$""2" }awkで連結された2つのawk文字列が連続していることです。しかし、それらは$演算子ではなく文字列です。

awk '{print "$""'"$variable"'" }'
    <--quoted---><---var---><-q-> 

追加の二重引用符を削除します。

tcsh> set variable = 2
tcsh> echo a b c | awk '{print $'"$variable"' }'
b

またはPOSIX-yシェルから:

$ variable=2
$ echo a b c | awk '{print $'"$variable"' }'
b

関連情報