Verwenden der CSV-Zeile als Befehlsparameter

Verwenden der CSV-Zeile als Befehlsparameter

Ich habe eine CSV-Datei wie:

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

Und ich habe einen Befehl, der diese Parameter annimmt:

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

Was ist der einfachste Weg zu laufenmein Befehlfür jede Zeile der CSV?

Antwort1

Das geht ganz einfach:

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

1dlöscht die Überschriftenzeile. sDer Befehl ändert die Zeichenfolge wie in Ihrem Beispiel und führt eam Ende des sBefehls die Zeichenfolge aus. Dies ist eine GNU-Erweiterung. Wenn Sie also nicht über GNU sed verfügen, können Sie xargsstattdessen Folgendes verwenden e:

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

Antwort2

Wenn es sich bei Ihrer CSV-Datei um eine einfache CSV-Datei ohne Anführungszeichen handelt (und deshalb in einem Feld keine Kommas erscheinen können), können Sie die Analyse in der Shell durchführen.

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

Wenn Felder in Anführungszeichen gesetzt werden können, benötigen Sie einen echten CSV-Parser. Verwenden SiePerl, Python, R, Ruby oder andere Sprachen.

Antwort3

Neben sed gibt esawk...

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

verwandte Informationen