输入
Time Value Flag
06:15:10 49.95 Actual
00:00:00 0.00 NoValue
06:22:50 49.94 Actual
06:23:00 49.93 Actual
06:23:10 49.93 Actual
06:23:20 49.93 Actual
06:23:30 49.93 Actual
06:24:40 49.92 Actual
00:00:00 0.00 NoValue
我必须替换包含“NoValue”的行。时间将替换为上次记录的时间,增量为 10 秒(10 秒) 值将替换为上次记录的时间 标志将替换为实际
我的结果将显示为,
Time Value Flag
06:15:10 49.95 Actual
06:15:20 49.95 Actual
06:22:50 49.94 Actual
06:23:00 49.93 Actual
06:23:10 49.93 Actual
06:23:20 49.93 Actual
06:23:30 49.93 Actual
06:24:40 49.92 Actual
06:24:50 49.92 Actual
尝试这个:
猫小说 | tr -s " " | awk -F"[: ]" -f val.awk
在哪里:
和
结果是:
注意:使用 awk 我们沿着字符冒号 (:) 和空格分解每一行。这样我们就可以访问时间戳的三个组件(第 1、2、3 列),以便可能添加 10。我们使用 tr 将多个空格压缩为一个。awk 中的 F 标志设置为沿冒号和/或空间分解行以进行操作。
在不知道时间戳适用的日期和时区以及使用理解日期和时间的实用程序(即不仅仅是简单的数学)的情况下,您无法通过在现有时间上增加 10 秒来确定新时间,因为新时间是给定时间增加 10 秒受夏令时和闰秒影响。
假设您的输入时间戳的开始日期是今天,然后使用 GNU awk 作为时间函数(它处理 DST,但与处理 POSIX 纪元时间的所有工具一样,不处理闰秒,所以希望您不关心那个):
如果您希望将时间计算应用于您的计算机设置的其他时区,请
TZ
在执行上述操作之前适当设置 shell 变量,或在调用mktime()
and时设置 UTC 标志strftime()
,请参阅https://www。 gnu.org/software/gawk/manual/gawk.html#Time-Functions。如果您想使用与今天不同的开始日期,请调用脚本以
awk -v date='2021 10 03' -f tst.awk file
提供您喜欢的任何日期YYYY MM DD
格式。以上假设时间戳将始终填充在您输入的第二行,因为您没有说明如何处理它。
请注意,正如@PhilipCouling 在评论
mktime()
(或任何其他库)中指出的那样,仅给出一个日期和时间就不能可靠地返回自 DST 结束时转换间隔期间具有 DST 的时区的纪元以来的秒数(DST 开始时很好)。他们提供的例子是: