Shell 如何在unix中将2012-05-03T25:00:00转换为2012-05-04T01:00:00
我不知道如何在unix中实现这一点,有人能帮助/建议转换吗Shell 如何在unix中将2012-05-03T25:00:00转换为2012-05-04T01:00:00,shell,unix,Shell,Unix,我不知道如何在unix中实现这一点,有人能帮助/建议转换吗 2012-05-03T25:00:00至2012-05-04T01:00:00在Unix命令/脚本中 在我的文件中,我有不止一个事件需要转换到第二天的不同时间 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 等 我试过了,但不知
2012-05-03T25:00:00至2012-05-04T01:00:00
在Unix命令/脚本中
在我的文件中,我有不止一个事件需要转换到第二天的不同时间
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
非常感谢您提供的任何帮助首先,请使用cat'yourfile'打开它。然后在每一行上做一个循环。然后使用grep和cut。这真的很简单,对你来说最有效的学习方法就是浏览cat、grep和cut的手册页。
希望对您有所帮助。如果您的系统上安装了Tcl,则
clock
命令将使您的操作变得非常简单:
设置t 2012-05-03T31:59:59
lassign[split$t]日期时间
lassign[split$time:]小时分钟秒
设置基准[时钟扫描$日期-格式%Y-%m-%d]
设置新[时钟添加$base$小时$min分钟$sec秒]
放入[时钟格式$new-格式%Y-%m-%dT%T];#->2012-05-04T07:59:59
cygwin的更新:
首先,使用cygwin安装程序安装8.5.x版的“tcl”包(位于解释器类别中)。然后,你可以这样做
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
最后,我得到了一个带有bug的解决方案(如果日期是这个月的最后一天,那么这将不起作用,但我可以接受) 做了一件笨拙的工作
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
如果有人想改进这个脚本,请继续
再次感谢all。您基本上需要解析错误的时间规范,将所有内容转换为秒,将其添加到一起,并将其转换回正确的日期
date-d“date”+%s
自1970年1月1日起产生秒数<代码>日期-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
如果您没有最新版本的GNU
date
,您可以在Hi Robert找到一些替代方法,这不是一个错误,这是我们的系统生成文件的方式。为什么25小时会转换为次日00小时?我希望24将转换为00,25将转换为01。嗨,格雷格,哎呀,我犯了一个错误,谢谢我会更新它。你有时间吗:2012-05-35T987:224:1562
?这些@符号在数据文件中做什么?这些程序都没有计算日期的逻辑。它们可以删除无趣的信息,但不能添加有趣的信息。而且使用cat
的指南毫无用处。我以为他只是想手工修改一个文件。我不知道他想计算日期。但是现在你说,确实必须有一种逻辑方法来计算日期,简单地删除小时并增加日期将是不合理的。伙计们,我仍在努力。我发布了我的工作,非常感谢Glenn,我正在使用cygwin,不知道如何使用Tcl。
awk 'END { print '"$basedate"'+('"$hh"'*60*60)+('"$mm"'*60)+'"$ss"'}' </dev/null