Variable Int を位置パラメータとして使用 [$6 ではなく $($var)]

Variable Int を位置パラメータとして使用 [$6 ではなく $($var)]

ファイル変換を処理するための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

おすすめ記事