bash脚本更改.csv文件中的日期格式

时间:2013-10-09 18:23:56

标签: bash sed grep

我目前正在处理每周批量-50plus csv文件,其时间戳显示为2013年10月1日星期二10:59:59。我需要能够逐行检查并将格式更改为10 / 01/13 10:59:59一些文件将时间戳作为第一个字符串,有些文件将其作为第三个字符串。我没有运气......

以下是两个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."

正如您所看到的,我有一些我尝试过评论过的选项

3 个答案:

答案 0 :(得分: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

为我的样本输入工作。

答案 1 :(得分:0)

你可能想要awk。

此脚本查看每个字段,并尝试将其更改为所需格式的日期。 然后,它将BACK更改为原始格式,以验证它是否与原始格式匹配。 如果原始文件与刚创建的文件匹配,我们将替换该字段,然后打印。

如果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
}

答案 2 :(得分:0)

这可能适合你(GNU sed):

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