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

관심 있는 특정 숫자에만 일치하고 그 이상은 일치하지 않도록 정규식을 좀 더 구체적으로 작성해야 합니다.

이를 올바르게 수행하는 방법에는 두 가지가 있습니다.

  1. 올바른 내용과 일치하도록 대체 항목의 정규식을 수정합니다(하드).
  2. $10가장 긴 문자열을 먼저 일치시킵니다. 예를 들어 from $1대신 from $1to $10(또는 변수가 많은 경우) 순서로 바꿉니다 .

두 번째 옵션을 사용하세요.

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.

관련 정보