コマンドパラメータとして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の最後で文字列を実行します。これは GNU 拡張機能なので、GNU sed がない場合は、代わりに以下sを使用できます。xargse

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

関連情報