Como criar um loop com cinco (5) variáveis de entrada?

5

Eu tenho um comando proprietário que requer cinco (5) entradas para executar corretamente o comando.

command -cval <value> -tval <value> -dval <value> -kval <value>

Eu preciso que esse comando possa ser executado lendo as entradas de um arquivo de configuração linha por linha, de modo que, quando novos requisitos para esses 5 valores forem fornecidos, eu possa simplesmente acrescentar uma nova linha de dados na parte inferior de meus arquivos. arquivo de configuração e execute novamente o script. Direito simples ???

Meu arquivo de configuração é configurado com "GRUPO" prefixado para que eu possa usar somente linhas no arquivo contendo "GROUP" para que novas entradas possam ser adicionadas ao arquivo de configuração facilmente no mesmo formato a ser processado (não Certifique-se de que esta é uma boa ideia):

## ORIG CONFIG FILE ##
cval, tval, dval, mval, kval    
cval, tval, dval, mval, kval
cval, tval, dval, mval, kval
...

## GROUP APPENDED CONFIG FILE ##
GROUP, cval, tval, dval, mval, kval     
GROUP, cval, tval, dval, mval, kval
GROUP, cval, tval, dval, mval, kval
...

OBSERVE: Esses valores no arquivo de configuração podem ser duplicados. Por isso, quero que eles sejam processados linha por linha. Também posso configurar o arquivo de configuração de qualquer maneira que eu escolher, então sinta-se à vontade para me dizer por que esse caminho é ou não é ideal.

Minha pergunta: Como executo o comando em um loop para processar meus dados da seguinte forma:

LOOP1 (para primeira linha) Comando cval, tval, dval, mval, kval

LOOP2 (para segunda linha) Comando cval, tval, dval, mval, kval

LOOP3 (para terceira linha) Comando cval, tval, dval, mval, kval

... etc, etc, loop para cada linha no arquivo de configuração.

    
por SSDdude 05.06.2018 / 21:25

3 respostas

6

Dado este arquivo:

$ cat input
GROUP, cval1, tval1, dval1, mval1, kval1
DISREGARD, you, should, not, parse, this, line
GROUP, cval2, tval2, dval2, mval2, kval2
GROUP, cval3, tval3, dval3, mval3, kval3

E dado este script:

#!/bin/bash
awk -F, '/^GROUP/ {print $2,$3,$4,$5,$6}' input | while read c t d m k; do
  echo -cval $c -tval $t -dval $d -mval $m -kval $k
done

Obtemos este resultado:

$ ./go.sh
-cval cval1 -tval tval1 -dval dval1 -mval mval1 -kval kval1
-cval cval2 -tval tval2 -dval dval2 -mval mval2 -kval kval2
-cval cval3 -tval tval3 -dval dval3 -mval mval3 -kval kval3

Substitua echo pelo seu comando proprietário e você deve estar pronto.

    
por 05.06.2018 / 21:35
3

sed method:

sed -n '/^GR/{s/^GROUP/command/
              s/,/-c/
              s/,/-t/
              s/,/-d/
              s/,/-m/
              s/,/-k/
              s/-./ &val /gp}' input

Saída (dado o que está no OP ):

command -cval cval -tval tval -dval dval -mval mval -kval kval
command -cval cval -tval tval -dval dval -mval mval -kval kval
command -cval cval -tval tval -dval dval -mval mval -kval kval

Para realmente executar a saída (após verificar cuidadosamente qualquer código inválido), altere a gp ( g lobal p rint ) no final para ge ( g lobal e valuate ).

    
por 06.06.2018 / 00:03
3

Com Paralelo GNU (e emprestando descaradamente a entrada fornecida em DopeGhoti's answer

grep '^GROUP' input | parallel --col-sep ', *' -- \
  /bin/echo -cval {2} -tval {3} -dval {4} -mval {5} -kval {6}

Saída:

-cval cval1 -tval tval1 -dval dval1 -mval mval1 -kval kval1
-cval cval2 -tval tval2 -dval dval2 -mval mval2 -kval kval2
-cval cval3 -tval tval3 -dval dval3 -mval mval3 -kval kval3

Substitua /bin/echo pelo seu comando real.

    
por 06.06.2018 / 14:28