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

関連情報