在尝试的同时在 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 示例代码将正常工作(无需关闭管道的写入端)。