使用 awk 创建和导出/导入变量?

使用 awk 创建和导出/导入变量?

我有一个文件,其中每一行都是新客户信息,例如

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

相关内容