구경하는 동안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 샘플 코드가 제대로 작동합니다(파이프의 쓰기 끝을 닫을 필요가 없습니다).