2013-10-09 66 views
-2

我目前正在處理一個批次-50加csv文件,每週的時間戳顯示爲Tue Oct 01 10:59:59 PDT 2013.我需要能夠通過逐行並將格式更改爲10/01/13 10:59:59。一些文件有第一個字符串的時間戳,一些有第三個字符串。我沒有運氣...bash腳本在.csv文件中更改日期格式

這是一個csv文件的兩個片段。

1.csv

Tue Oct 01 10:59:59 PDT 2013,data1,1,Databcd,Dataxyz,0,0,431,0 

Tue Oct 01 11:59:59 PDT 2013,data1,1,Databcd,Dataxyz,0,0,401,0 

2.csv

data1,0,Databcd,0,0,0,Tue Oct 01 11:59:59 PDT 2013,Dataxyz 

data1,0,Databcd,0,0,0,Tue Oct 01 12:59:59 PDT 2013,Dataxyz 

在此先感謝 -

這裏是腳本,因爲我最後一次運行它..

#!/bin/bash 

for f in $* 
do 
echo "Processing [$f]..." 

ftemp=$f.TMP 
    #echo "ftemp=$ftemp" 
#this uses sed to delete the day(word) frm the timestamp. 
sed -e 's/Mon //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Tue //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Wed //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Thu //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Fri //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Sat //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed -e 's/Sun //g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 

#strip out the PDT & Year from end of each line 
sed -e 's/\ PDT//g' -e 's/\ PST//g' <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
sed --date="Oct 01 00:59:59 2013" +%D <$f >$ftemp 
mv $ftemp $f #copy it back over the original 
#echo "10/01/2013" | sed -E 's/([a-z ]?)\/([0-9][0-9 ]?)\/([0-9][0-9][0-9][0-9] 
#/\3-\2-\1/' <$f >$ftemp 
# tr 'Oct' '10/' <$f >$ftemp 
# mv $ftemp $f #copy it back over the original 
done 

echo "Done." 

正如你所看到的,我有我已經嘗試註釋掉

+0

'我有沒有運氣...'。告訴我們你的嘗試。 – devnull

回答

1

下面是使用sed嘗試幾個選項:您的樣品輸入工作對我來說

sed -i.bak -r -e 's,[[:alpha:]]{3}\s+([[:alpha:]]{3})\s+([0-9]{2})\s+([0-9]{2}:[0-9]{2}:[0-9]{2})\s+[A-Z]{3}\s+[0-9]{2}([0-9]{2}),\1/\2/\4 \3,g' -e 's/Jan/01/; s/Feb/02/; s/Mar/03/; s/Apr/04/; s/May/05/; s/Jun/06/; s/Jul/07/; s/Aug/08/; s/Sep/09/; s/Oct/10/; s/Nov/11/; s/Dec/12/;' *.csv 

+0

我試着將它添加到我的腳本中 - 沒有運氣,但我確實將它作爲獨立腳本運行,並且它工作,更改了原始.csv文件。我結束了.csv.bak文件也..非常感謝。有沒有辦法做同樣的事情,而不是創建.csv.bak文件? – n11k0n

+0

@ n11k0n不要創建備份文件,只需從'-i.bak'中刪除'.bak'。閱讀手冊頁'man sed'選項'-i' – jkshah

+0

感謝您的協助,我能夠解決.bak問題,我非常感謝您的幫助。 – n11k0n

0

你可能想要awk。

此腳本查看每個字段,並嘗試將其更改爲所需格式的日期。 然後,它將其更改回原始格式,以驗證它是否與原始格式匹配。 如果原件與剛創建的相匹配,我們將替換該字段並進行打印。

如果TZ沒有設置爲您的CSV文件的內容,您可能會遇到匹配時區的問題。

#!/bin/awk -f 
BEGIN { FS = ","; OFS="," } 
{ 
    # print 
    for (i=1; i<=NF; i++) 
    { 
     cmd = "date -d '" $i "' +'%D %T' 2> /dev/null" 
     # print cmd 
     if ((cmd | getline result) > 0) 
     { 
      # print $i, result 
      cmd = "date -d '" result "' +'%a %b %d %T %Z %Y'" 
      if ((cmd | getline revert) > 0) 
      { 
       # print $i, result, revert 
       if ($i == revert) 
       { 
        # print "Changing " $i " to " result 
        $i = result 
       } 
      } 
      # print $i 
      # print "" 
     } 
    } 
    print 
} 
0

這可能爲你工作(GNU SED):

sed -ri '1{x;s/^/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;x};G;s/... (...) (..) (..:..:..) PDT ..(..)(.*)\n.*\1(..).*/\6\/\2\/\4 \3\5/;s/\n.*//' file