Shell-Script

使用 awk 創建和導出/導入變數?

  • October 2, 2017

我有一個文件,其中每一行都是新客戶資訊,例如

Pop corn, pop@gmail.com, 50, 200

我目前正在嘗試查看是否可以使用 aawk/gawk script將每列分配給一個變數,然後通過管道將這些變數sed替換為模板?我將在 bash 腳本中同時執行 awk/gawk 和 sed。我可以遵循什麼好的實現來完成這項工作?我試圖不使用grep,因為我正在嘗試學習如何將 awk/gawk、sed 和 bash 腳本結合使用,或者perl因為我還沒有學會它。

在我看來,您最好執行以下操作:

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 將這些行讀入變數。並在 here-document 中使用 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

引用自:https://unix.stackexchange.com/questions/395551