【问题标题】:change gmt of text file in one line with awk and date使用 awk 和日期在一行中更改文本文件的 gmt
【发布时间】:2019-02-09 14:20:14
【问题描述】:

我有一个包含如下字段的文件:

OID   ,"DATA","PARENT ","APP       ","DSN     ","JOB            ",RUN_,START ,END   ,NDICATOR,"SUB ",FROM_TIME   ,TO_TIME     ,TYPE ,TASK,CRIT,"NOD ","OWNER   ","AUTH ","CMD  ","DESC        ",CONF,CYCL,TYPE,IND_CYCLIC,INT,MAX_
14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",1 ,18:30:00 GMT+00:00,18:30:50 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,        
14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",2 ,19:00:10 GMT+00:00,19:01:00 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,        
14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",3 ,19:30:20 GMT+00:00,19:31:10 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,        
14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",4 ,20:00:30 GMT+00:00,20:01:20 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points ",0    ,1    ,Interval  ,S       ,00030M, 
.....

我只能从 time 中获取并添加 1 小时,为此我使用 awk 并存储在变量中,然后我使用 date 添加 1 小时

echo $(date -d "$variable 1hour" +%H:%M:%S)

所需的输出是在 START 标头中添加一小时:

19:30:00
20:00:10
20:30:20
21:00:30

只有一个命令就可以做到吗?

感谢和抱歉我的英语!

【问题讨论】:

  • 请将该示例输入的所需输出添加到您的问题中。
  • 嗨,所需的输出是 from_time hours +1 hour: 19:30:00 20:00:10 20:30:20 21:00:30
  • 我已经编辑了主帖
  • 您是否需要考虑夏令时和闰秒(即使用真实世界的日期/时间进行操作),或者您是否只需要在每小时 24 时添加 1?另外 - 你有可用的 GNU awk(试试awk --version)。
  • 您的意思是“将 1 小时添加到 START 列”,对吗? FROM_TIME 列的每一行都有值“19:30”。

标签: date awk


【解决方案1】:

我会在该文件上使用适当的 CSV 解析器 -- 我希望允许引用的字段包含逗号。

这里有一些 python 可以进行 CSV 解析和日期运算:

python3 <<'END'
import csv, datetime, re
hour = datetime.timedelta(hours=1)
file = "file.csv"
with open(file) as f:
    reader = csv.reader(f)
    headers = reader.__next__()
    for row in reader: 
        t = datetime.datetime.strptime(re.sub(r':(\d\d)$', r'\1', row[7]), '%H:%M:%S %Z%z')
        print((t + hour).strftime("%T"))
END
19:30:00
20:00:10
20:30:20
21:00:30

(警告,我不每天使用 python,所以这可能不是惯用的 python)

【讨论】:

    【解决方案2】:

    使用 GNU awk 进行 FPAT 和 gensub():

    $ awk -v FPAT='[^,]*|"[^"]+"' -v OFS=',' '
        { $8=sprintf("%02d%s",($8+1)%24,gensub(/[^:]+/,"",1,$8)); print }
    ' file
    OID   ,"DATA","PARENT ","APP       ","DSN     ","JOB            ",RUN_,01,END   ,NDICATOR,"SUB ",FROM_TIME   ,TO_TIME     ,TYPE ,TASK,CRIT,"NOD ","OWNER   ","AUTH ","CMD  ","DESC        ",CONF,CYCL,TYPE,IND_CYCLIC,INT,MAX_
    14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",1 ,19:30:00 GMT+00:00,18:30:50 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,
    14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",2 ,20:00:10 GMT+00:00,19:01:00 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,
    14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",3 ,20:30:20 GMT+00:00,19:31:10 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points CHANGE232",0    ,1    ,Interval  ,S       ,00030M,
    14082 ,"CEX         ","HOME_TABLE          ","ALERT          ","        ","job_ALERT_00002_home",4 ,21:00:30 GMT+00:00,20:01:20 GMT+00:00, ,"home          ",19:30       ,18:55       ,OS        ,Job       ,0    ,"home  ","system","user1 ","hostname       ","Update points ",0    ,1    ,Interval  ,S       ,00030M,
    

    上面带引号的字段可以包含逗号。

    【讨论】:

    • 哇!如果我想修改下一个字段(END),我应该在 awk 中添加其他 -v 修饰符吗?我正在尝试解码您的代码。谢谢!
    • 没有。在 GNU awk 手册中查找 FPATOFS 以了解它们的作用。注意到脚本中的$8了吗?这代表第 8 个字段,即 START 字段 - 将我对该字段所做的操作重复到任何其他字段,以对其进行相同的更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    相关资源
    最近更新 更多