изменить gmt текстового файла в одну строку с awk и датой - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть файл с некоторыми полями, подобными этим:

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, 
.....

Я могу получить только время и добавить 1 час, для этого я использую awk и сохраняю переменную, а затем использую дату, чтобы добавить 1 час

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

Требуемый вывод - добавить один час к заголовку START:

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

Можно ли получить это только одной командой?

Спасибо и извините за мой английский!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

С 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,

Приведенные выше поля могут содержать запятые.

0 голосов
/ 04 сентября 2018

Я бы использовал правильный синтаксический анализатор CSV для этого файла - я бы хотел, чтобы поля в кавычках содержали запятые.

Вот некоторый питон, который выполняет разбор 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 изо дня в день, так что это может быть не идиоматический питон)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...