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最后只报告列表中最后一个元素的检查状态。如果列表中的任何数字都在范围内,我需要一种方法让我的变量设置为假。
答案 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
变量g20
和l30
初始设置为1来工作。如果输入行数小于20,我们将g20
设置为0(即,并非所有输入都大于20)。同样,如果任何输入大于30,我们会将l30
设置为0.在完成所有输入后,我们会打印g20
和l30
的值。这将成为进程替换的输出,使用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
但现在变量必须以错误开始。