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

Использование строки 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"

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

решение1

Это довольно просто:

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

решение2

Если ваш 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 или другие языки.

решение3

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

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

Связанный контент