Usando linha CSV como parâmetros de comando

Usando linha CSV como parâmetros de comando

Eu tenho um arquivo CSV como:

Name,Age,Address
Daniel Dvorkin,28,Some Address St. 1234
(... N ...)
Foo Bar,90,Other Address Av. 3210

E eu tenho um comando que usa estes parâmetros:

./mycommand --name="Daniel Dvorkin" --age=28 --address="Some Address St. 1234"

Qual é a maneira mais fácil de executarmeu comandopara cada linha do CSV?

Responder1

Isso é muito fácil:

sed '1d;s/\([^,]*\),\([^,]*\),\([^,]*\)/.\/mycommand --name="\1" --age="\2" --address="\3"/e' file.csv

1dexcluirá a linha de legenda. sO comando modificará a string como no seu exemplo eno final do scomando executará a string. esta é a extensão GNU, então se você não possui o GNU sed, você pode xargsusar e:

sed '1d;s/\([^,]*\),\([^,]*\),\([^,]*\)/.\/mycommand --name="\1" --age="\2" --address="\3"/' file.csv | xargs

Responder2

Se o seu CSV for um CSV simples, sem mecanismo de cotação (portanto, vírgulas não podem aparecer em um campo), você poderá fazer a análise no shell.

{
  read line  # ignore the header line
  IFS=,
  while read -r name age address; do
    ./mycommand --name="$name" --age="$age" --address="$address"
  done
} <input.csv

Se os campos puderem ser citados, você precisará de um analisador CSV real. UsarPerl, Python, R, Ruby ou outras linguagens.

Responder3

Além do sed, háestranho...

awk -F, 'NR > 1 { system("./mycommand --name=\\\"" $1 "\\\" --age=" $2 " --address=\\\"" $3 "\\\"") }' < file.csv

informação relacionada