Преобразование даты в время эпохи с использованием AWK в Linux - PullRequest
4 голосов
/ 01 ноября 2011

У меня есть файл, разделенный запятыми, с первым столбцом в качестве даты в формате 31.01.2010 что я хочу изменить на время эпохи, чтобы файл "file.csv":

 01/30/2010,1,"hi"
 01/31/2010,3,"bye"

изменится на «output.csv»:

 1264809600,1,"hi"
 1264896000,3,"bye"

Я знаю, что командная строка date -d "30/01/2010" +% s будет работать, но только в одну дату, и мне нужно вставить ее в таблицу, поэтому есть ли способ использовать awk с некоторыми функциями ():

cat file.csv | awk -F, 'print func($1)","$2","$3}'

Так как мне все равно, как я это делаю, в качестве альтернативы, как бы я изменил дату в excel на эпоху, когда строка - это мм / дд / гггг ...

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011
TZ=PST awk -F, '{split($1,date,"/");
                 $1=mktime(date[3] " " date[1] " " date[2] " " "00 00 00");
                 print}'

Или, вызывая date:

TZ=PST awk -F, '{ OFS = FS;
                  command="date -d" $1 " +%s";
                  command | getline $1;
                  close(command);
                  print}'
1 голос
/ 01 ноября 2011

В Excel, скажем, a1 имеет 30.01.2010.затем укажите =(A1-DATE(1970,1,1))*86400 где-нибудь, а затем измените числовой формат на Общий

В качестве альтернативы, я не знаю awk, но с python (для .total_seconds ()) требуется довольно свежая версия

import datetime as DT
f = [
'01/30/2010,1,"hi"',
'01/31/2010,3,"bye"',
]
e0 = DT.date(1970,1,1)
for line in f:
    mm,dd,yyyy=[int(x) for x in line[:2],line[3:5],line[6:10]]
    e=int((DT.date(yyyy,mm,dd)-e0).total_seconds())
    print str(e) + line[10:]
0 голосов
/ 26 апреля 2016
echo "2016-01-31 23:47:27" | awk -F, '{ OFS = FS;command="date -d " "\"" $1 "\""  " +%s";command | getline $1;close(command);print}'

Нам нужно передать двойные кавычки, потому что нам нужно выполнить ниже:

date -d"2016-01-31 23:47:27" +%s
...