Использование CSV-строки в качестве параметров команды

У меня есть файл CSV, например:

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

И у меня есть команда, которая принимает эти параметры:

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

Какой самый простой способ запустить mycommand для каждой строки CSV?

Это довольно легко:

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

1d удалит строку надписи. команда s изменит строку, как в вашем примере e в конце s команда выполнит строку. это расширение GNU, поэтому, если у вас нет GNU sed, вы можете использовать xargs вместо e :

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

Если ваш CSV – это простой CSV без механизма цитирования (поэтому запятые не могут появляться в поле), вы можете провести синтаксический разбор в оболочке.

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

Если поля могут быть указаны, вам нужен настоящий синтаксический анализатор CSV. Используйте Perl, Python, R , Ruby или другие языки.

Помимо sed, есть awk …

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