Bashでさまざまな変数を使用して一連の数値間の数値を計算する方法

Bashでさまざまな変数を使用して一連の数値間の数値を計算する方法

(a,b),(c,d),(e,f)..etc など、多くの整数ペアがあります。最初の要素の値が2番目の要素の90%から150%の間であることを確認し、値をパスとして印刷する必要があります。

(a,b) 値はファイルの異なる列から 2 回出てきます。

ファイル1:1 12 123 1234-text-1 12345

ファイル2:2 23 234 1239-text-1 12347

a="$(find . -name *abc.gz* -mtime 1 | xargs zcat | awk -F"," '{print $4}' | grep "text-1" | awk '{$1=$1;print}' | awk '{print $1}')"

b="$(find . -name *abc.gz* -mtime 10 | xargs zcat | awk -F"," '{print $4}' | | grep "text-1"| awk '{$1=$1;print}' | awk '{print $1}')"

#a=1234
#b=1239

b1="$(bc <<<"${b}*9/10")"
b2="$(bc <<<"${b}*15/10")"

if [ ${a} -ge ${b1} -a ${a} -le ${b2} ];
  then
  echo "PASS"
  else
  echo "FAIL"
fi

ファイル$ 5、$ 6などの他の列に対して、「text-2」、「text-3」などの他のテキスト値を実行する必要があります。

ベストアンサー1

これは質問全体に対する答えではありませんが、bashはどのような浮動小数点演算も実行できないことに注意してください。

$ if [ 1234 -ge 1115.1 -a 1234 -le 1858.5 ]; then echo ok; else echo nope; fi
bash: [: 1115.1: integer expression expected
nope

bcに比較をすることができます:

check() {
   local result=$(echo "0.9*$2 <= $1 && $1 <= 1.5*$2" | bc)
   (( result == 1 )) && echo OK || echo NO
}
check 1234 1239    # => OK
check 1234 12390   # => NO

おすすめ記事