1

我不确定这将如何在 unix 中完成,任何人都可以帮助/建议 2012-05-03T25:00:00 to 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

ETC

我试过了,但不知何故 sed 不起作用

日期.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,

脚本.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

4 回答 4

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 安装程序,安装 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 
于 2012-05-03T10:26:07.857 回答
1

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

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 版本,您可以在http://www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-date/date找到一些替代方法

于 2012-05-04T04:12:16.927 回答
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

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

再次感谢大家。

于 2012-05-04T02:13:01.607 回答
-3

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

于 2012-05-03T08:08:29.943 回答