Usando la línea CSV como parámetros de comando

Usando la línea CSV como parámetros de comando

Tengo un archivo CSV como:

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

Y tengo un comando que toma estos parámetros:

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

¿Cuál es la forma más fácil de ejecutar?mi comandopara cada línea del CSV?

Respuesta1

Eso es bastante fácil:

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

1deliminará la línea de título. sEl comando modificará la cadena como en su ejemplo eal final del scomando ejecutará la cadena. Esta es una extensión GNU, por lo que si no tienes GNU sed, puedes usar xargsen su lugar e:

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

Respuesta2

Si su CSV es un CSV simple sin mecanismo de comillas (por lo tanto, las comas no pueden aparecer en un campo), puede realizar el análisis en el 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

Si los campos se pueden citar, necesita un analizador CSV real. UsarPerl, Python, R, Ruby u otros idiomas.

Respuesta3

Además de sed, hayawk...

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

información relacionada