如何在UNIX中将2012-05-03T25:00:00转换为2012-05-04T01:00:00

时间:2012-05-03 05:00:53

标签: shell unix

我不确定在unix中如何做到这一点可以任何人帮助/建议转换     Unix命令/脚本中的2012-05-03T25:00:00 to 2012-05-04T01:00:00

在我的文件中,我有多次出现,需要转换为第二天的不同时间

2012-05-03T25:00:00 to 2012-05-04T01:00:00
2012-05-03T26:50:00 to 2012-05-04T02:50:00
2012-05-03T31:59:59 to 2012-05-04T07:59:59

我尝试了但不知何故sed无法正常工作

Date.txt

2009-09-12T05:18:@00@+10:00,D,
2009-09-12T05:24:00+10:00,2009-09-12T05:24:@00@+10:00,D,
2009-09-12T05:25:00+10:00,2009-09-12T05:25:@00@+10:00,D,
2009-09-12T05:27:00+10:00,2009-09-12T05:27:@00@+10:00,D,
2009-09-12T30:29:00+10:00,2009-09-12T05:29:@00@+10:00,D,
2009-09-12T29:31:00+10:00,2009-09-12T05:31:@00@+10:00,D,
2009-09-12T28:33:00+10:00,,D,
2009-09-12T27:00:@00@+10:00,U,
2009-09-12T26:01:00+10:00,2009-09-12T05:01:@00@+10:00,U,
2009-09-12T24:04:00+10:00,2009-09-12T05:04:@00@+10:00,U,
2009-09-12T24:59:59+10:00,2009-09-12T05:06:@00@+10:00,U,
2009-09-12T30:08:00+10:00,2009-09-12T05:08:@00@+10:00,U,
2009-09-12T31:59:59+10:00,2009-09-12T05:10:@00@+10:00,U,
2009-09-12T05:17:00+10:00,,U,
2009-09-12T25:25:@00@+10:00,D,

script.sh

awk -F"T" -v OFS=',' '{print $1}' date.txt > tmpdate
uniq -d tmpdate > tmpuniq
rm tmpdate
date1=`cat tmpuniq`
date2=`date --set="$date1" +%F`
date3=$(date --date="$date2" -d "+1 day" +"%F")
T1=$date2+"T24"
T2=$date3+"T00"
echo $T1
echo $T2
dos2unix date.txt
#sed -i 's/$T1/$T2/g' date.txt > test.txt
#sed -i 's/"$T1"/"$T2"/g' date.txt > test.txt
sed -i 's/'$T1'/'$T2'/g' date.txt

任何帮助非常感谢

4 个答案:

答案 0 :(得分:2)

如果你的系统上有Tcl,clock命令可以很容易:

set t 2012-05-03T31:59:59
lassign [split $t T] date time
lassign [split $time :] hour min sec
set base [clock scan $date -format %Y-%m-%d]
set new [clock add $base $hour hours $min minutes $sec seconds]
puts [clock format $new -format %Y-%m-%dT%T]   ;# -> 2012-05-04T07:59:59

cygwin更新:

首先,使用cygwin安装程序,安装“tcl”软件包的8.5.x版本(位于Interpreters类别中)。然后,你可以这样做

normalize_time() {
    printf '
        lassign [split "%s" T] date time
        lassign [split $time :] hour min sec
        set base [clock scan $date -format %%Y-%%m-%%d]
        set new [clock add $base $hour hours $min minutes $sec seconds]
        puts [clock format $new -format %%Y-%%m-%%dT%%T]
    ' "$1" | tclsh
}
normalize_time 2012-05-03T31:59:59 

答案 1 :(得分:0)

最后我得到了一个带有错误的解决方案(如果日期是该月的最后一天,那么这将不起作用,但我可以忍受它)

并且做了一项笨拙的工作

date1=`cat date.txt | awk -F. '{print substr($1,1,10)}'|uniq |head -1`
echo $date1
date2=$date1"T24"
date21=$date1"T25"
date22=$date1"T26"
date23=$date1"T27"
date24=$date1"T28"
date25=$date1"T29"
date26=$date1"T30"
date27=$date1"T31"
date3=$(date --date="$date1" -d "+1 day" +"%F")
echo $date2
cat date.txt | grep "$date2"
tmpdate=`echo $date1 | sed -e 's/-//g'`
echo $tmpdate
date4=`echo $(date -d $(echo \`expr $tmpdate + 1\`F) +"%F")`
echo $date4
date41=$date4"T00"
date42=$date4"T01"
date43=$date4"T02"
date44=$date4"T03"
date45=$date4"T04"
date46=$date4"T05"
date47=$date4"T06"
date48=$date4"T07"

sed -i 's/'$date2'/'$date41'/g' date.txt
sed -i 's/'$date21'/'$date42'/g' date.txt
sed -i 's/'$date22'/'$date43'/g' date.txt
sed -i 's/'$date23'/'$date44'/g' date.txt
sed -i 's/'$date24'/'$date45'/g' date.txt
sed -i 's/'$date25'/'$date46'/g' date.txt
sed -i 's/'$date26'/'$date47'/g' date.txt
sed -i 's/'$date27'/'$date48'/g' date.txt

如果有人想改进此脚本,请继续。

再次感谢所有人。

答案 2 :(得分:0)

您基本上需要解析错误的时间规范,将所有内容转换为秒,将其重新添加到一起,然后将其转换回正确的日期。

date -d "date" +%s自1970年1月1日起产生秒数。date -d @1234567890将此格式的日期转换回常规的人类可读日期。

#!/bin/sh

IFS=T:

while read date hh mm ss; do
    basedate=$(date -d "$date" +%s)
    date -d @$(echo "$basedate+($hh*60*60)+($mm*60)+$ss" | bc) +%FT%T
done <<EOF
    2012-05-03T25:00:00
    2012-05-03T26:50:00
    2012-05-03T31:59:59
EOF

我在这台计算机上没有bc所以我用一个小的awk脚本替换了我的原始尝试,但它不是很易读。

awk 'END { print '"$basedate"'+('"$hh"'*60*60)+('"$mm"'*60)+'"$ss"'}' </dev/null

如果你没有最近版本的GNU date,你可以在http://www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-date/找到一些替代方法

答案 3 :(得分:-3)

首先,使用cat'yourfile'打开它。然后在每一行上做一个循环。然后用grep和cut。这真的很简单,你学习的最有效的方法是阅读cat,grep和cut的手册页。
希望它会有所帮助。