Eu tenho um arquivo de texto dividido assim:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Cada uma dessas colunas será um parâmetro para um programa e eu gostaria que o programa fosse chamado para cada linha
Eu estava esperando por um loop, algo como:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Qual seria a melhor maneira de realizar algo assim no bash?
bash
text-processing
scripting
csv
reitor
fonte
fonte
Respostas:
Isso deve funcionar se o número de campos for constante. Em vez de
echo
usar seu comando.fonte
Você deve usar um
while
com oread
built-in:Como isso funciona
cut
instrução pega a linha e a divide no delimitador especificado por-d
.--output-delimiter
é o caractere separador quecut
será usado para exibir os campos selecionados, aqui escolhemos um espaço para que possamos colocar os diferentes campos na matrizfields
.-f1-
entra em jogo.fields
, é possível acessar qualquer campo específico desejado com a sintaxe em${field[number]}
quenumber
seja um a menos que o número do campo real desejado, pois a indexação da matriz é baseada em zero no Bash.Nota
Para um número constante de campos
Em vez disso, você pode fazer algo semelhante à resposta do 1_CR :
O acima, embora pareça mais barulhento, deve funcionar em qualquer shell compatível com POSIX, não apenas no Bash.
fonte
IFS
um valor apropriado naread
invocaçãoVocê pode
read
dividir cada linha em uma matriz,
configurandoIFS
adequadamente.Portanto, no exemplo acima, você pode acessar cada elemento da matriz usando seu índice, iniciando 0.
fonte
Este
awk
one-liner fará o que você deseja:Substitua
echo
por seu comando ef.txt
pelo arquivo que você deseja repetir.Breve explicação:
-F,
será definido,
como delimitador.cmd
cria o comando esystem(cmd)
chama o comandofonte
o gnu sed também pode ser usado.
observe o uso da opção e no comando s
fonte