Digamos que eu tenha o seguinte arquivo CSV (sample.csv)
filepath1
filepath1,filepath2
filepath1,filepath2,filepath3
filepath1,filepath2,filepath3,filepath4
filepath1,filepath2
E o programa que preciso usar usa a seguinte sintaxe:
program_im_using --file filepath1
Mas se houver vários arquivos presentes, a sintaxe para entrada é:
program_im_using --file filepath1 --file filepath2
or
program_im_using --file filepath1 --file filepath2 --file filepath3
O que eu faria para colar os valores do arquivo CSV seria algo assim:
filepath_first=( $(awk -F "\"*,\"*" '{print $1}' $sample_csv) )
filepath_second=( $(awk -F "\"*,\"*" '{print $2}' $sample_csv) )
for i in "${!filenames[@]}"; do
program_im_using --file "${filepath_first[i]}" --file "${filepath_second[i]}"
done
Meu exemplo do que estou fazendo só funciona se eu tiver exatamente 2 colunas de valores em cada linha. Como posso generalizar de forma que, se eu tiver uma coluna, eu obtenha:
program_im_using --file filepath1
Mas se eu tiver dois
program_im_using --file filepath1 --file filepath2
etc?
Para um número variável de argumentos, uma abordagem comum é armazenar os argumentos em uma matriz, por exemplo:
Um script de exemplo para listar argumentos de entrada:
Podemos então alimentar o programa com esses argumentos assim:
Arquivo de entrada de exemplo:
Usando
sed
para reformatar nossas linhas csv:Alimentando os
sed
resultados em umbash/while-read
loop:NOTAS:
bash
Isso gera:
Usando
GNU awk
:Rendimentos:
Então, você pode canalizar
awk
parabash
executar:Analisando
CSV
comawk
:https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
Mais avançado: https://www.gnu.org/software/gawk/manual/gawk.html#More-CSV
Você pode usar
xargs
: