如何更新 UNIX 中特定位置的文件中的日期(按 30 天)?

如何更新 UNIX 中特定位置的文件中的日期(按 30 天)?

如何更新 UNIX 中特定位置的文件中的日期(按 30 天)? awk 或 sed 可以帮忙吗?

文件格式如下 -

Thomson:xyz
格式:1
字符集:ASCII8
文件类型:事件文件
文件子类型:mobile_call
文件组编号:1
文件组内编号:1 组内文件
总数:19
源 ID:源
标签:标签 -v13

该文件由 GTFplaintext 0.1 生成:

Event: "61765","1","2014/01/03-13-00-00.00",,"GBP",,,,,,,,,,"61765","0345351816","1407",,,,,,,,,,,,,,,,,,,,,
Footer: text_data_transfer_file
AuditValue_1: 1
AuditValue_2: 0
End: text_data_transfer_file
Lines: 15
Characters: 351
Checksum:
Security_checksum:
End_of_file:

在上面的文件中,我需要转到以“Event:”开头的行,并将日期
“2014/01/03-13-00-00.00”更新 30 天(仅需要更新日期,而时间可以保持不变) )。
目录中有 20k 个这样的文件,必须更新这些文件的日期。

答案1

使用perlDate::Manip模块,您可以执行以下操作:

 perl -MDate::Manip -pi -e 's|^Event.*?"\K\d{4}/\d\d/\d\d|
   UnixDate(DateCalc("$&", "30 days later"), "%Y/%m/%d")|e' file1 file2...

答案2

awk '
  /^Event:/{
    d=substr($0,match($0,"[0-9]{4}(/[0-9]{2}){2}"),RLENGTH)
    "date +\"%Y/%m/%d\" -d \""d" 30 days\""|getline ds
    sub(d,ds)
    }
  1' file

Event:对于从find substring日期格式开始match并放入变量 中的行d。然后使用系统date命令将变量设置ds为日期,而不是在字符串中使用dfor30 dayssubstitute dby 。ds

相关内容