bash检查列表中的所有元素都在一个范围内

时间:2012-10-03 12:39:57

标签: bash

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应该保持为假。就目前而言,我的Echo最后只报告列表中最后一个元素的检查状态。如果列表中的任何数字都在范围内,我需要一种方法让我的变量设置为假。

2 个答案:

答案 0 :(得分:1)

只需在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的值。这将成为进程替换的输出,使用bash命令将其读入两个read变量。

(我已经删除了对uniq的调用,因为它需要对其输入进行排序,并且您似乎对计数不感兴趣,只是存在超出范围的值。可能需要更多的时间来排序和删除重复项,而不是仅通过awk运行它们来进行范围检查。这样可以更容易合并两个awk程序,但为了简单起见,会离开他们。)

答案 1 :(得分:0)

我猜你可以将你的变量OR一起:

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

但现在变量必须以错误开始。