2013-10-09 46 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