在Linux中一行中增加数字的最佳方法

在Linux中一行中增加数字的最佳方法

我有一行有很多条目,其中也有时间。

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

我想每次增加几个小时。采用 24 小时格式。例如10:30:00将变成15:30:00

完成这项工作的最佳通用工具是什么?我正在考虑:

  1. 系统实用程序,例如awksed..以及其他我不知道的

  2. vim

  3. 脚本语言,如bashpython`

这样做的规范方法是什么?

答案1

只是为了澄清:

vim是大多数 *nix 系统上的系统实用程序(文本编辑器)。awk、、sedbash是您可以用来解析和改变文本的语言(或工具,取决于上下文)。

您需要增加时间做什么,以及需要多久增加一次?这些因素会影响您要使用的工具。无论如何,这是一个多部分的工作,假设这不是 SQL:

  1. 您首先要匹配字符串中的部分字符串。您可以使用awksedgrep -e以及正则表达式来提取这些子字符串。

  2. 当您拥有这些值时,您会将它们转换为整数(或者如果您使用的是更完整的语言,如 Python,您可能能够使用库将它们转换为日期时间值)。您必须进行所需的数学运算(以及验证,如果适用)才能更改这些值。

  3. 最后,您将替换的值添加到行中并保存更改后的文件。

不过说实话,这看起来像sql,所以使用内置工具用该语言来改变这些价值观。

答案2

有一些很好的提示这个答案建议使用 Perl、Python、Ruby 等脚本语言来找到阻力最小的路径,允许混合数学和匹配操作。

以下是使用 Perl 的快速破解方法:

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

在这个简单的示例中,数字字符类 ( \d) 后跟重复指示符(例如{2})用于捕获日期的位置组件,我们盲目地对小时字段进行算术运算。这种类型的解决方案仅在您足够了解数据以确保对小时字段进行简单的算术运算不会导致日期滚动时才适用。

重新审视此问题以解决@Lieven 提示的小时字段溢出时的正确日期/时间算术,Time::Piece可以使用 Perl 核心模块(Perl>5.8):

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

此示例输入已更新,以显示如何妥善处理延展到第二天的小时值。它在Time::Piece命令行中引入模块,匹配输入中的日期时间,转换为Time::Piece对象以执行日期/时间算术,然后将其字符串化回所需的输出格式。

相关内容