作为三个变量的一部分,我想确定最高和最低之间的差异是否小于定义的范围。
Val1
Val2
Val3
到现在为止,我只有两个Val而且我使用了类似的东西:
let diff=${Val1}-${Val2}
然后,我计算了包含在" diff"。
中的绝对值if [ "$diff" -ge 0 ]
then
absval=$diff
else
let "absval = (( 0 - $diff ))"
fi
但是现在,更有效的方法是什么?
答案 0 :(得分:2)
使用if
测试直接比较变量。
if [[ $Val1 -gt $Val2 ]]
then highest=$Val1
else highest=$Val2
fi
if [[ $Val3 -gt $highest ]]
then highest=$Val3
fi
如果您有更多变量,您可以继续这样做:
if [[ $Val4 -gt $highest ]]
then highest=$Val4
fi
使用-lt
的类似步骤获得最低值。
另一种方法是对值进行排序,然后得到第一行和最后一行:
sorted=$(printf "%s\n" $Var1 $Var2 $Var3 | sort -n)
highest=$(echo "$sorted" | tail -1)
lowest=$(echo "$sorted" | head -1)
diff=$(( highest - lowest ))
答案 1 :(得分:2)
如果允许则使用awk
awk '{max=$1<max&&max~/./?max:$1;min=$1>min&&min~/./?min:$1}END{print max-min}' file
1
2
10个
5
3
9
9
答案 2 :(得分:2)
最有效的方法(你必须意识到,对于任何特定输入可能不是最快的方式)是迭代列表并简单地跟踪到目前为止最小和最大的数字
while read num; do
if (( num > highest )); then highest=num; fi
if (( num < lowest )); then lowest=num; fi
done <<EOF
Val1
Val2
Val3
...
EOF
diff=$(( highest - lowest ))
理论上,排序不是找到最高和最低的最有效方法,因为您不需要做额外的工作来按顺序放置所有数字。 (实际上,在bash
中的O(n)算法优于C中sort
实现的O(n lg n)算法之前,可能需要大量数字。)
答案 3 :(得分:0)
如果您可以将它们放在一个文件中,您可以在一个命令sort -V <filename>
中完成。这在数字上对它们进行排序。如果你有很多要排序的值,这可能是一个更好的选择,代码少得多。
以下是一个例子:
cat <filename>
1
2
10
5
3
9
sort -n <filename>
1
2
3
5
9
10
如果您想获得最低和最高数字以及它们之间的差异,您可以这样做。
result=$(sort -n <filename>)
high=$(echo "$result" | tail -1)
low=$(echo "$result" | head -1)
diff=`expr $high - $low`
echo "Highest is $high"
echo "Lowest is $low"
echo "Diff is $diff"