使用 awk 将 1 秒添加到 yyyymmddhhmmss

Ala*_*key 0 awk time replace

我有这个文件,其中第七个字段是 yyyymmddhhmmss。我需要将这个数字增加一秒。

到目前为止,我已经想出了:

awk 'BEGIN{FS=OFS="|"} $7=$7+1 ' <file> 
Run Code Online (Sandbox Code Playgroud)

它有点工作,但是......如果第七个字段的最后两位数字是“59”,它显然会替换为“60”。

有什么方法可以让 awk 知道该字段是日期,这样我就可以将整个列增加一秒?

当前文件

09099458|1|000|41181|0|0|20221130164738|67
82060649|1|000|36827|0|0|20221130172359|67
Run Code Online (Sandbox Code Playgroud)

预期结果

09099458|1|000|41181|0|0|20221130164739|67
82060649|1|000|36827|0|0|20221130172400|67  <- From 17:23:59 to 17:24:00
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Sté*_*las 10

使用 GNUawk@ThomasDickey\'​​smawk \xc2\xb9:

\n
$ gawk -F\'|\' -v OFS=\'|\' \'{\n   gsub("..", "& ", $7)\n   sub(" ", "", $7)\n   $7 = strftime("%Y%m%d%H%M%S", mktime($7) + 1)\n   print}\' < your-file\n09099458|1|000|41181|0|0|20221130164739|67\n82060649|1|000|36827|0|0|20221130172400|67\n
Run Code Online (Sandbox Code Playgroud)\n

gsub()调用"20221130164739"变成"20 22 11 30 16 47 39 ",sub()删除第一个空格以获得"2022 11 30 16 47 39 "期望的格式mktime()。后者将其转换为 UNIX 纪元时间。我们添加 1 并将其重新格式化为 YYYYmmddHHMMSS。

\n

如果您awk不支持mktime()/ strftime(),您可以随时使用perl及其核心Time::Piece模块:

\n
perl -MTime::Piece -F\'\\|\' -lase \'\n  $F[6] = (Time::Piece->strptime($F[6], $format) + 1) -> strftime($format);\n  print join "|", @F\' -- -format=%Y%m%d%H%M%S < your-file\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,我们依靠Time::Piece类似于strptime()标准 C 函数的同名函数来将输入字符串解析为日期。这使得该解决方案更容易适应其他日期格式(除了更便携之外)。

\n

如果您既没有gawkmawk也没有perl,某些 shell(例如 zsh 或 ksh93)具有对日期/时间解析和格式化的内置支持。

\n

例如,在 中zsh,这可能是:

\n
zmodload zsh/datetime\nformat=%Y%m%d%H%M%S\nwhile IFS=\'|\' read -ru3 -A fields; do\n  strftime -rs t $format $fields[7] &&\n    strftime -s \'fields[7]\' $format $(( t + 1 ))\n  print -r -- ${(j[|])fields}\ndone 3< your-file\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xc2\xb9 自20121129 版本发布以来,截至撰写本文时,几乎正好是 10 年前。

\n