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

awk怎么了?


仅针对澄清进行更新

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

由于其他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

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

这是一个打字错误

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          

或者,仅使用bash:

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

相关内容

  • 没有找到相关文章

最新更新