只是想知道为什么这不起作用?
这是我的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.
答案 0 :(得分: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
答案 1 :(得分: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));
}
答案 2 :(得分: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
答案 3 :(得分:0)
或者,仅使用bash:
IFS=: read -a a < input.txt
((retval=${a[0]}*3600+${a[1]}*60+${a[2]}))
echo "$retval"