2011-11-01 113 views
3

我有一個逗號分隔的文件,第一列是格式爲01/31/2010 的日期,我想將其更改爲紀元時間,以便文件「 FILE.CSV「:在Linux中使用AWK將日期轉換爲紀元時間

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

會變成 」output.csv「:

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

我知道在命令行日期-D 」二○一○年一月三十○日「 +%s將工作,但只有在一個日期,我需要餵它到一個表,所以,有沒有辦法使用一些func()的awk:

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

因爲我真的不關心我怎麼做,或者,我會如何更改日期,在EXCEL導入時代,當字符串爲MM/DD/YYYY ...

+0

您應該指出您的時區。這是PST,對吧? – ninjalj

+0

您是否無法控制文件的生成?你將能夠生成具有紀元時間的文件嗎? – Kusalananda

回答

5
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}' 
+0

非常感謝,那做了工作! – eran

+1

第二個答案似乎更好,但是,如果第一個字段在隨後的輸入行(記錄)中沒有更改,則只有序列的第一行獲得轉換的第一個字段,則下一個轉換後的行是具有第一個字段不同於之前的行......爲什麼如此? – pms

+1

@pms:'getline'檢查它正在訪問的命令/文件。如果它是一個已經打開的,它從那裏讀取下一個輸入行。所以,你需要關閉這個命令。很好的接收,我從來沒有注意到關於'getline'。 – ninjalj

1

在Excel中,說a1有1/30/2010。再有=(A1-DATE(1970,1,1))*86400某處,然後更改數字格式是通用

另外,我不知道的awk,但蟒蛇,(是需要.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
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 
+0

你給答案還是問問題? – JayRugMan

+0

這與ninjalj給出的答案相同,不同之處在於它是inline.You將得到如果您將嘗試運行上述命令。 –

+0

echo「2016-01-31 23:47:27」| awk -F,'{OFS = FS; command =「date -d \」「$ 1」「$ 2」\「+%s」;命令|函數getline;關閉(命令); print}「的工作原理也是如此,撇號較少。 – JayRugMan

相關問題