usando a função printf para padrões repetidos

3

Eu tenho códigos que acrescentam os padrões no arquivo de texto w.r.t. entrada do usuário da seguinte forma:

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

deixe assumir que a entrada do usuário abcd ab12 , em seguida, comandos anexa linhas abaixo;

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

Eu preciso adicionar epos e upos strings para cada entrada para linhas separadas da seguinte maneira (para as mesmas entradas do exemplo acima);

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

Como posso modificar a opção pattern para anexar essas linhas ao arquivo de dados?

    
por deepblue_86 20.12.2015 / 21:09

2 respostas

4

Com o 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]

Assim como o printf(3) do GNU libc , %<n>$s no GNU awk , refere-se ao argumento n th após o formato.

Portável:

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
    
por 20.12.2015 / 22:15
0

Outra abordagem que permite especificar dinamicamente a lista de "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
    
por 23.12.2015 / 10:10

Tags