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
1d
eliminará la línea de título.
s
El comando modificará la cadena como en su ejemplo
e
al final del s
comando ejecutará la cadena. Esta es una extensión GNU, por lo que si no tienes GNU sed, puedes usar xargs
en 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