2016-09-14 6 views
1

これはあまりにも素朴ではない質問です。セミコロンで区切られた一連のファイルがあり、そのうちのいくつかは数字です。例は次のようになります。awkを使用して小数点範囲を検索する

A;B;4.564;C;D;E;5.698;F;G;H;7.893 

などです。

ファイルの中で、数字は多少異なる場合があります。たとえば、上記の例の5.698は他のファイルの5.691または5.703などです。ですから、私は5.685から5.710までの検索範囲を設定しました。コードはawk one-linerが実際にこの検索を実行するまでうまくいくが、私はそこに残っている。ここではawkのコードは次のとおりです。

awk -v low=$NUM3 -v high=$NUM2 '{if ($0 >= low && $0 <= high) {print "1"} else {print "0"} }' 

私は検索範囲を表現するためのawkにbashの変数をインポートした後、低値と高い値の間の数値がある場合、単純な検索を設定しています。私はまた、他のバリエーションを試してみました:

awk -v low=$NUM3 -v high=$NUM2 'low<=$0 && $0<=high' 

任意の助けをいただければ幸い、私は以前の質問を検索するが、この特定の問題に遭遇しませんでした。私はawkの専門家ではないので、事前に感謝します。

+0

あなたの入力例からどのような出力が期待されますか?その範囲の数字をすべて印刷したいのですか? – alexbclay

+0

それはいいかもしれません(私のコーディングの専門知識の外に!)、しかし必要ではありません。私は存在/不在フラグを生成しようとしていたので、 "1"または "0"なので、特定の範囲を持つファイルを追跡できます。ありがとう! – CJF

答えて

1

最初の1つのライナーの中の$0は、あなたがマッチしている行全体を意味するので、おそらくあなたが望むことをしていません。

awk -F\; '{ for (i=1; i<=NF; i++) { print $i }}' 

をループ内であなたが確認することができます:あなたが個別に各トークンを処理したい場合は、(あなたの例では;のように見える)に区切るために、文字を設定し、そのようにループのためのawkを使用する必要がありますこのようになります明確なフォーマットで

awk -F\; -v low=$NUM3 -v high=$NUM2 '{n=0; for (i=1; i<=NF; i++) { if ($i >= low && $i <= high) { n++; }} print n}' 

:ので、あなたのような範囲内の数値のため

awk -F\; -v low=$NUM3 -v high=$NUM2 '{n=0; 
             for (i=1; i<=NF; i++) { 
             if ($i >= low && $i <= high) { 
              n++; 
             } 
             } 
             print n;}' 

これは、トンで何かを発見した回数を表示します彼は各ラインの範囲を与えた。

+0

私はawk '{print $ 0}'が行全体を返すので、$ 0がライン全体を返そうとしていましたが、これはすばやい検索であり、より集中的なネストループを必要としないことを期待していました。しかし、私はあなたのソリューションを試してみましょう。 – CJF

+0

さて、これはうまくいきましたが、これらの値の合計を出力するように出力を変更すると役に立ちます。つまり、返される値は1つだけです。出力を新しいawkにパイプして値。私はより効率的な方法があると確信していますが、これはうまくいきます。 – CJF

+0

数値自体またはファイル内で発生する回数を合計しますか? – alexbclay

関連する問題