次のような「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変数をn
csh変数と同じ値に設定します$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