挑戦しながらbash シェルで日付を変換する、 私は試した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 サンプル コードがそのまま機能します (パイプの書き込み側を閉じる必要はありません)。