我有一个文件,其中每一行都是新客户信息,例如
Pop corn, [email protected], 50, 200
我目前正在尝试查看是否可以使用 aawk/gawk script
将每一列分配给一个变量,然后通过管道将这些变量sed
替换到模板中?我将在 bash 脚本中运行 awk/gawk 和 sed。我可以遵循什么好的实施来完成这项工作?我试图不使用grep
,因为我正在尝试学习如何紧密地使用 awk/gawk、sed 和 bash 脚本,或者perl
因为我还没有学会它。
答案1
在我看来,你最好这样做:
while IFS=, read -r name email x y _ignored_; do
email=${email# } x=${x# } y=${y# }
sendmail -oem -oi -t << EOF
To: $name <$email>
Subject: Whatever
x=$x y=$y
EOF
done < file.csv
那是因为无论如何您都将在每一行运行至少一个命令,因此请使用 shell 将这些行读入变量。并在此处文档中使用 shell 变量扩展而不是sed
进行模板扩展。
awk
在这里没有多大帮助,因为虽然它可以使用system()
or运行命令getline()
(但通过运行 shell 来解析命令行),但它不能放这些变量的环境变量,除了构建设置这些变量的 shell 代码之外。因此,它会变得相当复杂且效率较低。就像是:
CODE='sendmail -oem -oi -t << EOF
to: $name <$email>
Subject: Whatever
x=$x y=$y
EOF' awk -F ', *' -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{system("name="shquote($1)" email="shquote($2)" x="shquote($3) \
" y="shquote($4)"\n"ENVIRON["CODE"])}' < file.csv
答案2
使用split
函数 ofawk
将行读入具有特定分隔符的数组中。
awk '{split($0, array, /,/)}' customers_file
然后,您可以传递给sed
该数组的哪些元素,只需在 中打印这些元素即可提供给它awk
。