awkスクリプトはgsub $ 10では機能しません。

awkスクリプトはgsub $ 10では機能しません。

生成する必要があるフォームの手紙がたくさんあります。

    $>cat debug-form-letter
    The first field is $1, the second $2, the third $3,
    the 10th field is $10,but  the 10th correct value  is varA.



    $> cat debug-replace-value
    var1|var2|var3|var4|var5|var6|var7|var8|var9|varA|varB



    $> cat debug-replace-form-letter.awk
    BEGIN {FS = "|"
                       while (getline <"debug-form-letter")
                       line[++n] = $0
       }
    {for (i = 1; i <= n; i++) {  
                       s = line[i]         
                       for (j = 1; j <= NF; j++)  
                                  gsub("\\$"j, $j, s)
                       print s
               }
       }

私はこれを通して電話します

    $> awk -f debug-replace-form-letter.awk debug-replace-value 

--10 私はこれが欲しい

    The first field is var1, the second var2, the third var3,

    the 10th field is varA,but  the 10th correct value  is varA.

--20しかし理解しています。

    The first field is var1, the second var2, the third var3,

    the 10th field is var10,but  the 10th correct value  is varA.

上記の$ 10は正しくありません。 $1 + 0になります。二重引用符と一重引用符を試してみましたが、うまくいきません。

そして11ドルは1プラス1になります。

私のawkは4.1.3で、最新バージョンに更新しましたが、動作しません。

    $> awk -V
    GNU Awk 4.1.3, API: 1.1
    Copyright (C) 1989, 1991-2015 Free Software Foundation.

私のスクリプトに何の問題がありますか?どのように動作させることができますか?

ベストアンサー1

$1交換時には(およびなど)の初期部分も交換する必要があります。はに置き換えられ、残りに置き換えられます。$10$11$12$1var1$10var10var10$10

関心のある特定の数にのみ一致し、それ以上は一致しないように正規表現をより具体的に記述する必要があります。

これを正しく行う方法は2つあります。

  1. 正しい内容と一致するように代替項目の正規表現を変更します(ハード)。
  2. $10最も長い文字列を最初に一致させます。たとえば、fromの代わりに$1from $1to $10(または変数が多い場合)の順序で置き換えます。

2番目のオプションを使用してください。

awk 'NR == FNR { split($0, vars, "|"); next }
     { for (i = length(vars); i >= 1; --i) gsub("\\$" i, vars[i]) } 1' debug-replace-value debug-form-letter

特定のテキストに対して以下が生成されます。

The first field is var1, the second var2, the third var3,
the 10th field is varA,but  the 10th correct value  is varA.

おすすめ記事