将非整数与if进行比较

时间:2017-02-04 00:00:39

标签: bash if-statement conditional

我想查看一个带有一列十进制数字的文件,找到所有条目(+或 - )2.2的100并将它们重定向到一个文件。这是我到目前为止所得到的。

cat numfile.txt

100.56
99.6
96.8
86.77
105.7
95.5
92.4
101.1
102.5
98.7

这是我一直在尝试的事情

while read line
  do
    num=2.2

    if [ $line -ge $num ] 
      then 
        echo $line > savefile.txt
    fi
  done < numfile.txt

期望的输出

cat savefile.txt

100.56
99.6
101.1
98.7

3 个答案:

答案 0 :(得分:1)

我建议通过&#34; bc&#34;。

发送比较计算

例如

  result=$(echo "scale=2;  ( $line >= 100 - $num )  &&  ($line <= 100 + $num  ) " | bc)

$ result将是&#34; 0&#34;如果是假的&#34; 1&#34;如果陈述是真的。 你的if语句如下所示:

 if [ $(echo "scale=2;  ( $line >= 100 - $num )  &&  ($line <= 100 + $num  ) " | bc) -eq 1 ] ; 
     then 
         ... # do true stuff
  fi

答案 1 :(得分:0)

可能不是更好但是有效:

 if [ `echo "scale=2;sqrt((100-$line)^2)<=$num" | bc` -eq 1 ]

另一种方式:

num=2.2
awk '{if (sqrt((100-$1)^2) < '$num') { print $1}}' < numfile.txt > savefile.txt

答案 2 :(得分:0)

稍微混合两种方法:

c=2.2

while read n; do
    (( $(bc -l <<< "sqrt(($n-100)^2) <= $c") )) && echo $n
done < numfile.txt > savefile.txt

如果(( ))条件的内容不等于零,则bc条件求值为true;如果条件求值为真,则1打印-l

sqrt选项定义数学库,该库启用scale函数,并将20设置为Response.AddHeader "content-disposition","attachment; filename=your_file_name_here.xls"

我已将重定向移到循环外部,以避免每次都打开和关闭文件描述符。