Gawk
為什麼這個 gawk 協程序會掛起?
在bash shell 中嘗試轉換日期時,我嘗試了GNU awk 的協同處理功能:
gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; cmd |& getline d; $5 = d}1' foo
此命令掛起。我認為這可能是因為
date
正在等待讀取整個輸入,所以我嘗試關閉發送管道的一半:gawk -F, -v cmd='date +"%Y-%m-%d %H:%M:%S" -f-' '{print $5 |& cmd; close(cmd, "to"); cmd |& getline d; $5 = d}1' foo
這有效(是的,我知道我應該設置
OFS=,
,但現在……)。但是,
date
處理輸入時似乎沒有問題。這立即給出了第一行輸出:d='Thu Apr 27 2017 23:19:47 GMT+0700 (ICT)' (echo "$d"; sleep 1m; echo "$d") | date +"%Y-%m-%d %H:%M:%S" -f-
這是怎麼回事?
像許多其他程序一樣,
date
當 stdout 不是 tty 時,會緩衝 的輸出。通過呼叫它,stdbuf -oL
您將在每一行刷新輸出,並且您的第一個 Gawk 範常式式碼將正常工作(無需關閉管道的寫入端)。