簡體   English   中英

在 awk 中嵌套 if 語句的正確語法是什么?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM