Во время попыткиПреобразование даты в оболочке 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 будет просто работать (не нужно закрывать конец записи канала).