Должна быть возможность играть на «одном -лайнере». На самом деле вам нужно только правило, которое изменяет поле 10, если оно встречает отметку времени без миллисекунд, и одно правило, которое просто «печатает» всю строку для общего случая (, включая возможную модификацию из-за правила 1 ). Итак, если предположитьGNU Awk
:
awk -F'|' -v OFS='|' '$10 ~ /^[[:digit:]]{4}(-[[:digit:]]{2}){2} ([[:digit:]]{2}:){2}[[:digit:]]{2}$/ {$10=$10".000"} {print}' textfile
должно помочь.
Вышеупомянутое регулярное выражение в большинстве случаев чрезмерно "тщательно" проверяет отметку времени.Если вы достаточно доверяете своему формату файла, вы можете уменьшить проверку поля 10 до
awk -F'|' -v OFS='|' '$10 ~ /:[0-5][0-9]$/ {$10=$10".000"} {print}'
, для которого также больше не требуется версия GNU awk
.
Применение к тестовому входу
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33|m|n|o
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.123|m|n|o
дает:
~$ awk -F'|' -v OFS='|' '$10 ~ /:[0-5][0-9]$/ {$10=$10".000"} {print}' testinput
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.000|m|n|o
a|b|c|d|e|f|i|j|k|2020-01-20 10:22:33.123|m|n|o