2012-05-03 11 views
1

これはUNIXでどのように行われるかわかりません誰でも助けてください/変換することを助けることができます 2012-05-03T25:00:00 to 2012-05-04T01:00:00 Unixコマンド/私のファイルでスクリプト2012-05-03T25:00:00〜2012-05-04T01:00:00 in 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:@[email protected]+10:00,D, 
2009-09-12T05:24:00+10:00,2009-09-12T05:24:@[email protected]+10:00,D, 
2009-09-12T05:25:00+10:00,2009-09-12T05:25:@[email protected]+10:00,D, 
2009-09-12T05:27:00+10:00,2009-09-12T05:27:@[email protected]+10:00,D, 
2009-09-12T30:29:00+10:00,2009-09-12T05:29:@[email protected]+10:00,D, 
2009-09-12T29:31:00+10:00,2009-09-12T05:31:@[email protected]+10:00,D, 
2009-09-12T28:33:00+10:00,,D, 
2009-09-12T27:00:@[email protected]+10:00,U, 
2009-09-12T26:01:00+10:00,2009-09-12T05:01:@[email protected]+10:00,U, 
2009-09-12T24:04:00+10:00,2009-09-12T05:04:@[email protected]+10:00,U, 
2009-09-12T24:59:59+10:00,2009-09-12T05:06:@[email protected]+10:00,U, 
2009-09-12T30:08:00+10:00,2009-09-12T05:08:@[email protected]+10:00,U, 
2009-09-12T31:59:59+10:00,2009-09-12T05:10:@[email protected]+10:00,U, 
2009-09-12T05:17:00+10:00,,U, 
2009-09-12T25:25:@[email protected]+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 

すべてのヘルプははるかにそれを開くために

+0

こんにちは、ロバート、そのないエラーでいくつかの代替方法を見つけることができます – user790049

+0

なぜだろう時間25は午前00時に翌日に変換されますか?私は24が00に、25は01に変換されると期待します。 –

+0

こんにちはグレッグ、私は間違いを犯しました。私はそれを更新します – user790049

答えて

-3

まず、利用猫yourfile」を高く評価しました。次に、各行にループを作成します。 grepを使い、カットします。これは本当に簡単で、学習するための最も効率的な方法は、cat、grep、cutのmanページを調べることです。
うまくいくと思います。

+4

これらのプログラムには、日付を計算するためのロジックはありません。彼らは興味のない情報を削除できますが、面白い情報は追加しません。そして、 'cat'を使う指針は無駄なだけです。 http://partmaps.org/era/unix/award.html – tripleee

+0

私は彼が手でファイルを修正したかったと思った。私は彼が日付を計算したいと思ったことはありませんでした。しかし今、あなたは、日付を計算する論理的な方法が必要であることは事実であり、単純に時間を削除し、日付を増やすことは非感覚であると言います。 – Depado

+0

皆さん、私はまだ苦労しています。私の仕事を投稿しました。ありがとうございました – user790049

2

あなたのシステム上でのTclを使用している場合は、clockコマンドは、それはかなり簡単です:cygwinのための

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のインストーラを使用して、のバージョン8.5をインストールします"tcl"パッケージ(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 
+0

グレンさん、Tclの使い方がわからないcygwinを使っています。 – user790049

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 

誰でもこのスクリプトを改善したい場合は、先に進んでください。

もう一度全員に感謝します。

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 

私は小さなawkスクリプトを使用して、私のオリジナルの試みを置き換えるので、私はこのコンピュータ上bcを持っていなかったが、それは非常に読みやすいではありません。あなたはGNU dateの最近の十分なバージョンを持っていない場合

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

、あなたは私たちのシステムは、ファイルを生成方法だhttp://www.antonolsen.com/2006/04/06/bash-convert-unix-timestamp-to-a-date/

関連する問題