Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在unix中将2012-05-03T25:00:00转换为2012-05-04T01:00:00_Shell_Unix - Fatal编程技术网

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

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 等 我试过了,但不知

我不知道如何在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

我试过了,但不知怎么的,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