ファイル変換を処理するためのawk関数を開発していますが、代替の問題が発生するとは予想していませんでした。
現在のコード:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
したがって、File1は私が作成し、常に3つのフィールドしか持っていません。ただし、File2は複数のファイルのうちの1つにすることができ、各ファイルはそのデータにアクセスするために異なるパラメータ番号を使用します。
File2.aには20個のパラメータがあり、そのうちパラメータ8と9がターゲット値です。
File2.bには200個のパラメータがあり、そのうち4つと159個がターゲット値です。
この変更をどのように処理する必要がありますか? ${$var}、${!var}、evalを試しましたが、echo $var
何も機能しないようです。
必須コード:
NR == FNR {a[$1 FS $2] = $3; next}
${$var1} FS ${$var2} in a {${$var1} = a[${$var1} FS ${$var2}]}
[Where var1 and var2 acts as parameter args for File2]
[var1 = ${16} and var2 = ${25}]
また:認識できるパラメータの数に制限はありますか?私の反応は矛盾した。 $9 が最大値であるかのように、${19} は最大値で 255 であり、システム仕様によって制限はありません。
編集する:コメントに依頼したように、私の質問を明確にしようとします。私はawkを使ってファイルのパラメータを比較して置き換えています。 File1には常に3つのパラメータがあり、最初の2つはFile2のパラメータに関連付けられています。 File2には決定されていない数のパラメータがあります。 file1とfile2の間のパラメータマッピングは変数によって処理されます。だから私はawkの位置パラメータとして変数($ var1)を使ってみました。
私が使用している場合:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
私のコードは動作します。
私が使用している場合:
var1=9
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $var1 in a {$8 = a[$8 FS $var1]}
1' File1 File2
もう動作しません
$9 を ${$var1} / $(!var1) / $$var1 (awk から) に置き換えようとしました。
これらのどれも期待どおりに機能しません。 File Architectについては、私の内容を参照してください。前の質問
答え1
この記号は$
シェル(例:bash)とawk
。
シェルでは${name}
変数拡張が導入されました。変数が整数の場合、アクセスされる変数はシェルのリストです。議論。シェルの最大引数(がない場合{…}
)はですが、$9
新しい{…}
メモリ要求が許可される限り制限はありません。
アクセスawk
できるオペレータです。$
フィールド入力ライン。 mawkには32767の可能なフィールドという厳しい制限があります。
$ echo $(seq 80000) | mawk '{print $(32767+2)}'
mawk: program limit exceeded: maximum number of fields size=32767
しかし、GNU awkではそうではありません。
$ echo $(seq 80000) | awk '{print $(32767+2)}'
32769
awk
内部$
オペレーター繰り返し可能(例:(!
およびその他)も繰り返し可能):
$ awk 'BEGIN{var=111;print( !!!!!!var )}'
1
$ echo 23 {a..z} | awk '{field=1;print( $$field )}'
v
これはあなたが必要とするものに近いですか?
awk 'NR == FNR {a[$1 FS $2] = $3; next}
$$indexa FS $$indexb in a {$$indexa = a[$$indexa FS $$indexb]}
' filea indexa=16 indexb=25 fileb
答え2
将来の検索者のために答えを残してください。 pLumoと他のレビューアーが投稿しました。
awkとbashは '$'を別々に扱います。あなたはそれを使用することができますawk -v $var1=$input
-v は変数の作成に使用されます。 $ var1はawk変数名です。 $ inputはbash変数名です。 Isaacが述べたように、名前は同じかもしれません。