使用 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(因此逗號不能出現在欄位中),您可以在 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

如果欄位可以被引用,那麼您需要一個真正的 CSV 解析器。使用Perl、Python、R、Ruby 或其他語言。

答案3

除了 sed 之外,還有awk

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

相關內容