0
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 仅报告列表中最后一个元素的检查状态。如果列表中的任何数字在范围内,我需要一种方法将我的变量设置为 false。

4

2 回答 2

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并将两个脚本合并为一个,但这证明了这个想法。awkawk

这通过设置两个awk变量来工作,g20最初设置l30为 1。如果输入行小于 20,我们设置g20为 0(即,并非所有输入都大于 20)。同样,l30如果任何输入大于 30,我们设置为 0。在消耗完所有输入后,我们打印 和 的g20l30。这成为进程替换的输出,bash使用命令将其读入两个变量read

(我已经删除了对 的调用uniq,因为它无论如何都需要对其输入进行排序,而且您似乎对计数不感兴趣,只是对范围之外的值的存在感兴趣。可能需要更多时间来排序和删除重复项而不是只运行它们awk以进行范围检查。这将使合并两个awk程序更容易,但为简单起见,我将保留它们。)

于 2012-10-03T12:59:16.563 回答
0

我想你可以把你的变量或在一起:

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

但现在变量必须以假开始。

于 2012-10-03T13:19:39.440 回答