2012-11-25 112 views
0

只是想知道爲什麼這樣不起作用?awk將字段字符串分配給變量不起作用

這是我的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 ?只是clarifcation


更新

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

無用的'cat':'awk -f a.awk dmckee

+0

我沒有看到任何東西只是看着它,但我有兩個問題:(1)爲什麼你的'a.awk'轉儲從第3行開始? (並且我假設那些行號是這篇文章的修飾,而不是文件本身,對嗎?)和(2)如果從'input.txt'發送輸入,命令行版本是否正常工作? – dmckee

+0

@dmckee嘗試 lhe

回答

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)); 
} 
+1

我發現http://www.gnu.org/software/gawk/manual/html_node/Arithmetic-Ops.html,**和^是相同的東西。謝謝,我發現問題....這是一個錯字...應該返回retval;不返回$ retval; – lhe

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   
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 
0

或者,使用bash:

IFS=: read -a a < input.txt 
((retval=${a[0]}*3600+${a[1]}*60+${a[2]})) 
echo "$retval" 
相關問題