awkは$
(パターンベース)で区切られた一致する行の内容を抽出するために使用されます。IFS
awk `/LIG/{print $1, $2}' topol.top
シェルは、$
変数の保存された値を抽出するために使用します。例えば。for
リングの形。
for i in *; do
mv -- $i $i.pdb; done
(回答に応じて修正)
これら2つのケースの使用法は本質的に$
同じですか、それとも違うのですか?
違うとなぜ違いがあるのでしょうか? awkとシェルを混ぜるには$
?
ベストアンサー1
$
シェルと$
awkでは、時にはシェルの後ろに数字があり、時には変数があるため関連があるようです。$
awkでも同じですが、何の関係もありません。 2つのまったく異なるコンテキストで同じ文字を使用する2つはまったく異なります。ツールはawkとシェルでまったく異なる意味を$<number>
持ちます。$<variable>
シェルでは、変数を前に追加して逆参照でき、$
位置パラメータなどはこの点で変数と同じように処理されるため、次のことができます。
$0 = the path to the current command
$1 = the first argument passed to the command
$2 = the second argument passed to the command
$# = the number of arguments passed to the command
$? = the exit status of the last command run
$var = the value of the shell variable var
etc.
awk では$
(概念的に) 現在のレコードが分割されるフィールド配列の名前なので、次のことができます。ただ$
次の表現に使用されます。
$0 = the current record being processed
$1 = the first field of the current record
$2 = the second field of the current record
awk変数を逆参照するには、Cと同様にvar
その名前を使用しますvar
。実際、awk構文はシェルよりもCにはるかに似ています。
awkで使用されているものを見た場合は、逆参照ではなく名前だけで逆参照し、$var
数値(例えば)がある場合は現在のレコードの5番目のフィールドと同じであることを意味し、値がまったくない場合は現在のレコードと同じであることを意味します。$
var
var
var
var
5
$var
$5
var
$var
$0
var=0 => $var = $0 = the current record being processed
var=1 => $var = $1 = the first field of the current record
var=2 => $var = $2 = the second field of the current record
var="" => $var = $0 = the current record being processed
var="foo" => $var = $0 = the current record being processed
AwkとShellは、独自の構文、意味、変数の範囲などを備えた2つの完全に異なるツールです。したがって、それらをそのまま扱い、awkスクリプトで見たものがawkスクリプトで見たものと関係があると仮定しないでください。シェルスクリプトの構文、意味、範囲、またはその逆。