[英]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.