簡體   English   中英

bash檢查列表中的所有元素是否在范圍內

[英]bash checking all the elements in a list are within a range

LessThanThirty=1
GreaterThanTwenty=1

while read line 
do
    LessThanThirty=$(echo "$line <= 30.0" | bc)
    GreaterThanTwenty=$(echo "$line >= 20.0" | bc)
done < <(grep -A 26 "some text" someFile.txt | awk '/More Text/ { gsub(/M/, " "); print $4 }'     | uniq )

echo $LessThanThirty
echo $GreaterThanTwenty

我有一個完整的數字列表,想要測試它們是否都在20到30的范圍內。如果其中任何一個大於30,則LessThanThirty應該保持為false。 就目前而言,我的Echo僅報告列表中最后一個元素的檢查狀態。 如果列表中的任何數字都在范圍內,我需要一種將變量設置為false的方法。

只需在awk進行比較:

read GreaterThanTwenty LessThanThirty < <(
 grep -A 26 "some text" someFile.txt | \
 awk '/More Text/ { gsub(/M/, " "); print $4 }' | \
 awk 'BEGIN { g20=l30=1 }
      $0 < 20.0 { g20=0 }
      $0 > 30.0 { l30=0 }
      END { print g20, l30 }'
 )

您可能可以消除對uniq的調用,並通過使用awk數組消除重復項來相當容易地將兩個awk腳本合並為一個,但這證明了這個想法。

這可以通過將兩個awk變量g20l30初始設置為1來實現。如果輸入行小於20,則將g20設置為0(即,並非所有輸入都大於20)。 同樣,如果任何輸入大於30,則將l30設置為0。使用完所有輸入后,我們將打印g20l30的值。 這將成為流程替換的輸出,並使用read命令將其讀取到兩個bash變量中。

(我已經刪除了對uniq的調用,因為它仍然需要對輸入進行排序,而且您似乎對計數不感興趣,只是對范圍之外的值的存在感興趣。可能需要花費更多時間進行排序並刪除重復項,而只需將它們全部通過awk運行以進行范圍檢查即可。這將使合並兩個awk程序更加容易,但為簡單起見,我將其保留。)

我猜你可以將變量或在一起:

LessThanThirty=0
GreaterThanTwenty=0

while read line 
do
    LessThanThirty=$(echo "$line <= 30.0 || $LessThanThirty" | bc)
    GreaterThanTwenty=$(echo "$line >= 20.0 || $GreaterThanTwenty" | bc)
done < <(grep -A 26 "some text" someFile.txt | awk '/More Text/ { gsub(/M/, " "); print $4 }'     | uniq )

echo $LessThanThirty
echo $GreaterThanTwenty

但是現在變量必須以false開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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