1

なぜこれが機能しないのか疑問に思っていますか?

これは私のawkコードで、「hh:mm:ss」形式を秒に変換します

  a.awk 
  3 BEGIN {                                                                         
  4     FS=":";                                                                     
  5 }                                                                               
  6                                                                                 
  7 {                                                                               
  8     retval = 0;                                                                 
  9     for (i = 1; i <= NF; i++) {                                                 
 10         retval += $i * 60 ** (NF-i);                                            
 11     }                                                                           
 12     print $retval;                                                                
 13 }                                                                               
 14                                                              

 input.txt
 59:22:40

 $ cat input.txt  | awk -f a.awk 
    //<empty>
 $

ただし、コマンドラインで試してみます。

 $ echo "00:59:30" | awk 'BEGIN { FS=":" } { retval = 0; for (i = 1; i <= NF; i++) {  retval += $i * 60 ** (NF-i); } print retval;}'                 
 3570

a.awkの何が問題になっていますか?


明確にするためだけに更新する

$ awk --version
GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.
4

4 に答える 4

1

あなたの質問は他の2つの投稿ですでに回答されているので、同じ変換を数秒でdate達成するためにできるかわいいことがあります。hh:mm:ss

# GNU date

string_time="01:01:01"
string_time_in_seconds=$(date -u -d "1970-01-01 ${string_time}" +"%s")
echo ${string_time_in_seconds}

3661
于 2012-11-25T22:29:58.693 に答える
0

または、bashのみを使用します。

IFS=: read -a a < input.txt
((retval=${a[0]}*3600+${a[1]}*60+${a[2]}))
echo "$retval"
于 2012-11-25T23:06:20.137 に答える
0

そのforループはかわいいですが、これはより直接的で理解しやすいようです。

BEGIN {
    FS=":";
}

{
    retval = 0;
    in_hours = $1
    in_minutes = $2;
    in_seconds = $3;
    retval = (in_hours * 3600) + (in_minutes * 60) + in_seconds
    print retval;
}

ループの問題はべき乗にあると思います。私のバージョンは、少なくとも、どの**演算子もサポートしていません。これはあなたにとってよりうまくいくかもしれません。また、ドル記号にも注意してください。フィールドに必要です。変数には必要ありません。

for (i = 1; i <= NF; i++) {
    retval += i * (60^(NF-i));
}
于 2012-11-25T21:35:50.433 に答える
0

タイプミスでした

   a.awk 
    3 BEGIN {                                                                         
    4     FS=":";                                                                     
    5 }                                                                               
    6                                                                                 
    7 {                                                                               
    8     retval = 0;                                                                 
    9     for (i = 1; i <= NF; i++) {                                                 
   10         retval += $i * 60 ** (NF-i);                                            
   11     }                                                                           
   12     print retval;          ///<<<< notice here.                                                         
   13 }                                                                               
   14          
于 2012-11-25T22:05:24.837 に答える