[英]What is the correct syntax for nesting if-statements in awk?
我正在编写一个 awk 命令,我想使用条件块形式嵌套 if 语句:
condition{actions}
而不是使用 if 关键字的那个:
if(condition){actions}
这是因为我试图使用尽可能少的字符。
使用 if 关键字可以工作:
awk '{system("date +%s%N")}'|awk '{t[++b]=$1;}b>1{if(b>4)e=b-5;print int(6E10*(b-e)/(t[b]-t[e+1])),"bpm"}'
但是当我尝试用另一种方式做时:
awk '{system("date +%s%N")}'|awk '{t[++b]=$1;}b>1{b>4{e=b-5;}print int(6E10*(b-e)/(t[b]-t[e+1])),"bpm"}'
我收到一个语法错误:
awk:林。 de com.:1: {b++;}b>1{b>4{e=b-5;}t[b]=$1;r=int(3E11/(t[b]-t[++e] ));打印 r,"bpm"}
awk:林。 de com.:1:(......................)^ 语法错误
什么是正确的语法?
编辑:该命令用于计算用户在按下键盘上的 Enter 键时每分钟产生多少节拍 (bpm)。
输入:按回车键输出:他/她做了多少 bpm
示例——如果我以大约 115 bpm 的速度按下 Enter 键,答案可能或多或少是这样的:
120 次/分
112 次/分
119 次/分
122 次/分
不确定我是否在评论中表达了我的观点,所以......考虑一下:
awk '{system("date +%s%N")}'
可以写成:
date +%s%N
另一个脚本:
{b++;}b>1{if(b>4)e=b-5;t[b]=$1;r=int(3E11/(t[b]-t[++e]));print r,"bpm"}
当清楚地写出时是:
{
b++
}
b > 1 {
if (b > 4) {
e = b - 5
}
t[b] = $1
r = int(3E11 / (t[b] - t[++e]))
print r, "bpm"
}
然后显然可以更简短地重写为:
(++b) > 4 {
e = b - 5
}
b > 1 {
t[b] = $1
r = int(3E11 / (t[b] - t[++e]))
print r, "bpm"
}
从那以后, t[b]
和r
都没有明显的理由存在,因为你可以这样写:
(++b) > 4 {
e = b - 5
}
b > 1 {
print int(3E11 / ($1 - t[++e])), "bpm"
}
并且可以进一步简化为:
(++b) > 1 {
e = (b > 4 ? b - 5 : e) + 1
print int(3E11 / ($1 - t[e])), "bpm"
}
然后您可以根据需要将其挤回 1 行。 可能有其他方法可以减少代码,但没有一个例子来测试,就我想猜测的而言 - 上面可能已经引入了错误,因为没有可以测试的东西。 希望它能让您了解如何减少代码,以及为什么我们需要一个可以测试的示例来帮助您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.