在嘗試的同時在 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-
這是怎麼回事?
答案1
與許多其他程式一樣,date
當 stdout 不是 tty 時, 的輸出會被緩衝。透過呼叫它,stdbuf -oL
您將在每一行刷新輸出,並且您的第一個 Gawk 範例程式碼將正常工作(無需關閉管道的寫入端)。