我目前正在处理每周批量-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."
正如您所看到的,我有一些我尝试过评论过的选项
答案 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