3

日付と、スペースで区切られた2つの時間文字列(これらの多く)を以下の形式で含むテキストファイルがあります。

2011-03-05 15:16:41 15:16:42  

私の質問はこれです:
awkを使用して、どのように時刻を分離し、それらを変数に割り当ててから減算することができますか?上記の文字列に対する答えは次のようになります。

2011-03-05 0:0:1  

テキストファイルは、上記の形式の多くの行で構成されています。

私はSOを通過し、日付と時刻の算術の質問がたくさんあることを確認しましたが、この特定の要件に適合すると思われるものはありません。

どんな助けでも大歓迎です、
Sriram

4

2 に答える 2

3

これは、時間関数を使用しない単純なawkスクリプトです。

$ cat subtract.awk

{
hh1=substr($2,1,2);
mm1=substr($2,4,2);
ss1=substr($2,7,2);

hh2=substr($3,1,2);
mm2=substr($3,4,2);
ss2=substr($3,7,2);

time1=hh1*60*60 + mm1*60 + ss1;
time2=hh2*60*60 + mm2*60 + ss2;

diff=time2-time1;

printf "%s %d:%d:%d\n",$1,diff/(60*60),diff%(60*60)/60,diff%60;
}

入力データ:

$ cat file.txt
2011-03-05 15:16:41 15:16:42

それを実行します:

$ awk -f subtract.awk < file.txt

2011-03-05 0:0:1

または、次を使用できますmktime

{
    date=$1
    gsub(/[-:]/," "); 
    diff=mktime ($1" "$2" "$3" "$7" "$8" "$9) - mktime ($1" "$2" "$3" "$4" "$5" "$6);  
    printf "%s %d:%d:%d\n",date,diff/(60*60),diff%(60*60)/60,diff%60;
}
于 2011-03-22T11:33:11.397 に答える
1

時間演算については、時間関数が組み込まれた言語を使用する方が簡単だと思います。たとえば、Tclでは

set line "2011-03-05 15:16:41 15:16:42"
lassign [split $line] date time1 time2
set base [clock scan $date -format %Y-%m-%d]
set t1 [clock scan $time1 -format %T]
set t2 [clock scan $time2 -format %T]
set diff [expr {abs($t2 - $t1)}]
puts [clock format [clock add $base $diff seconds] -format "%Y-%m-%d %T"]
# ==> 2011-03-05 00:00:01
于 2011-03-22T13:27:45.977 に答える