printf 함수를 사용하여 패턴 반복

printf 함수를 사용하여 패턴 반복

아래와 같이 사용자 입력 텍스트 파일에 패턴을 추가하는 코드가 있습니다.

echo -n "WHICH STATIONS?"
read station
awk -v input="$station" '
 BEGIN {
        n = split(tolower(input), user)     
         pattern=  "force %-4s npos 0. .0001\n"       
    }
    {print}
    /<< write after this line >>/ {
        for (i=1; i<=n; i++)
             printf pattern, user[i]
        exit
    }
' ./data > data_2

사용자 입력을 가정하면 abcd ab12명령이 다음 줄에 추가됩니다.

force abcd npos 0. .0001
force ab12 npos 0. .0001

아래와 같이 별도의 줄에 각 입력에 대해 문자열을 추가해야 합니다 epos(위의 예와 동일한 입력에 대해).upos

force abcd npos 0. .0001
force abcd epos 0. .0001
force abcd upos 0. .0001
force ab12 npos 0. .0001
force ab12 epos 0. .0001
force ab12 upos 0. .0001

pattern이 줄을 데이터 파일에 추가하는 옵션을 어떻게 수정합니까 ?

답변1

GNU awk 사용:

pattern = "force %1$-4s npos 0. .0001\n" \
          "force %1$-4s epos 0. .0001\n" \
          "force %1$-4s upos 0. .0001\n"
[...]
printf pattern, user[i]

printf(3)GNU와 마찬가지로 libcGNU에서도 다음을 의미합니다.%<n>$sawkN형식 다음의 첫 번째 매개변수입니다.

가지고 다닐 수 있는:

pattern = "force %-4s npos 0. .0001\n" \
          "force %-4s epos 0. .0001\n" \
          "force %-4s upos 0. .0001\n"
[...]
printf pattern, j=user[i], j, j

답변2

"Xpos" 목록의 동적 지정을 허용하는 또 다른 방법

echo -n "WHICH STATIONS?"
read station

awk -v input="$station" -v 'xpos=npos epos upos' '
 BEGIN {
    n = split(tolower(input), user)
    m = split( xpos, Pos) 
    pattern=  "force %-4s %s 0. .0001\n"       
    }
  1
  /<< write after this line >>/ {
     for (i=1; i<=n; i++)
        for (j=1;j<=m;j++)
           printf pattern, user[i],Pos[j]
     exit
     }
' ./data > data_2

관련 정보