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はfalseのままである必要があります。現状では、最後の私のエコーは、リストの最後の要素のチェックのステータスのみを報告しています。リスト内の数値のいずれかが範囲内にある場合、変数を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 }'
 )

配列を使用して重複を排除することで、2つのスクリプトの呼び出しを排除し、2つのスクリプトを1uniqつにマージすることはおそらくawkかなり簡単ですが、これはその考えを示しています。awk

これは、2つのawk変数を設定g20し、l30最初は1に設定することで機能します。入力行が20未満の場合は、g200に設定します(つまり、すべての入力が20より大きいわけではありません)。同様に、l30入力が30を超える場合は、0に設定します。すべての入力を消費した後、との値を出力g20l30ます。bashこれがプロセス置換の出力になり、コマンドを使用して2つの変数に読み込まれますread

uniq(とにかく入力を並べ替える必要があり、カウントには関心がなく、範囲外の値が存在するだけなので、への呼び出しを削除しました。並べ替えと範囲チェックを行うためにすべてを実行するよりも重複を削除しますawk。これにより、2つのプログラムを簡単にマージできawkますが、簡単にするためにそのままにしておきます。)

于 2012-10-03T12:59:16.563 に答える
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

しかし今、変数はfalseとして開始する必要があります。

于 2012-10-03T13:19:39.440 に答える