我有一个 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