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

試してみましたが、どういうわけか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,

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

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 インストーラーを使用して、"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 
于 2012-05-03T10:26:07.857 に答える
1

基本的に、誤った時間指定を解析し、すべてを秒に変換し、それらを足し合わせて、適切な日付に変換し直す必要があります。

date -d "date" +%s1970 年 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:date //www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-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 と cut を使用します。これは非常に簡単で、学習するための最も効率的な方法は、cat、grep、および cut のマニュアル ページを参照することです。
それが役立つことを願っています。

于 2012-05-03T08:08:29.943 に答える