2017-10-25 5 views
0

値は次のようになります。を使用して、2つの変数、フィールドに基づいて行を選択することは、私はファイル(sample.bedgraph)を持っている

8 43825627 43825628 1313 
X 1753769 1753780 14 

私は、フィールド4を持っている任意の行を取り除くしたいと思います10より小さく150より大きい - フィルタされたファイルは2行目のみを持つべきです。

awk '$4 >= 10 && $4 <= 150' sample.bedgraph > sample.filtered.bedgraph 

は、しかし、私の10と150のしきい値は、一部の上流管コマンドから来て、私が行うので、もし私が、$ Minと$マックスとしてそれらを参照する必要があります:私は、私は単純に行うことができます知っている

awk '$4 >= $Min && $4 <= $Max' sample.bedgraph > sample.filtered.bedgraph 

全く返品はございません。私の変数($ Minと$ Max)に "'"を加えると、 は行をフィルタリングしません。私が最小値または最大値としか比較しない場合、それは機能しません。私はいくつかの他の投稿をチェックし、人々は "-v"を提案しますが、私はそれにも運がありませんでした。

アドバイスありがとうございます。ありがとうございました。

答えて

3

あなたはawkでは

$ Min=10 
$ Max=150 

などのシェル変数を得た場合は、以下のように使用することができたとは、レコード/行/行の4番目のフィールドならば、そのようなレコードが印刷され、10と150の間にあります。

$ awk -v min="$Min" -v max="$Max" '$4 >= min && $4 <= max' sample.bedgraph > sample.filtered.bedgraph 

は私が10未満と150より 大きなフィールド4を持っている任意の行を取り除くしたい - フィルタファイルには、2行目を持っている必要があります。

awk '$4 < 10 || $4 >150 {next}1' infile 

試験結果:

あなたは以下のような ORを持つことができますので、

150より

FIELD4 10未満と大きいが、ANDを使用して一緒にできません:私は、私は単純に行うことができます知っている

$ cat infile 
8 43825627 43825628 1313 
X 1753769 1753780 14 

$ awk '$4 < 10 || $4 >150 {next}1' infile 
X 1753769 1753780 14 
+0

ありがとうございます。 {次の}について少し説明していただけますか? – Helene

+1

field4が10未満または150より大きい場合、レコードは印刷されません。次に、次の行/レコードに移動することを意味します。最後の '1 'は' {print $ 0} '以外何もありません –

2

かなりかなり@3161993だと言われましたが、のように二重引用符)をawkに、シェルを$Varに展開します。トラブル(ロスタエスケープ)を探していますが、ここにはあります:

$ awk "\$4 >= $Min && \$4 <= $Max" file 
X 1753769 1753780 14 
+0

ありがとうございます。これは何が問題になると言うのですか?代わりに-vをお勧めしますか? – Helene

+1

はいそうです。 '-v'メソッドを使うと、すべての' $ 'やその他の文字をエスケープする手間が省け、コードを読みやすくします。 –

関連する問題