2017-05-02 6 views
-1

私はデータセットを持っており、特別な条件でフィルタを適用したいと思います。私はawkソリューションを好むだろうが、他のbashソリューションも受け入れられる。ファイルはタブで区切られ、出力もタブで区切られます。awkを使用したデータのフィルタリング

FILE1:

20 HIGH 15 down - 
90 LOW 20 up - 
100 LOW 25 syn benign 
50 LOW 40 syn - 
10 HIGH 10 down - 
10 LOW 50 down - 
5 PATHOGENIC 45 no - 
100 HIGH 40 no - 
20 LOW 30 int benign 
5 LOW 25 int - 

私は条件によってデータをフィルタする必要があります。

1. Allays keep row where $2 == HIGH and PATHOGENIC 
2. Remove $1 > 20 
3. Remove $3 <= 20 
4. Remove $4 == down 
5. Remove $4 == up 
6. Remove $4 == int && $5 == benign 

だから出力:

20 HIGH 15 down - 
10 HIGH 10 down - 
5 PATHOGENIC 45 no - 
100 HIGH 40 no - 
5 LOW 25 int - 

私の試みでした:

awk -v OFS="\t" '{if($1 >= 20 && $3 <= 20); print $1,$2,$3,$4,$5}' | awk -v OFS="\t" '{if($4 != down); print $1,$2,$3,$4,$5}' | awk -v OFS="\t" '{if($4 != up); print $1,$2,$3,$4,$5}' > output 

1.condition6.conditionを実装できません。また、私はこのフィルタリングがピッティングなしで実行できると信じています。

ありがとうございました。

+2

です。条件が矛盾します。有効な出力を表示 – RomanPerekhrest

+0

正しいです。条件が$ 4 == int && $ 5 ==良性の場合にのみ適用されるため、最後の行が表示されます。 – Geroge

+0

出力が正しい - 高と病原性を維持し、最後の行が条件$ 4 == int && $ 5 == benign 。 – Geroge

答えて

1

純粋だけで、あなたの入力フィルタリング条件に基づいて、あなたのawkコマンドはこれを好む必要がありますし、は理想的試合すべて

awk -v FS="\t" '($2 ~ /HIGH|PATHOGENIC/) || (!($1 >=20) && !($3<=20) && !($4 ~ /up|down/) && !(($4=="int") && ($5=="benign")))' file 

ライン、複数のパイプコマンドをカスケード接続する必要はありません指定された入力からのフィルタリング条件は

20  HIGH 15  down - 
10  HIGH 10  down - 
5  PATHOGENIC  45  no  - 
100  HIGH 40  no  - 
5  LOW  25  int  - 
+0

申し訳ありません変更1.条件 - HIGH + PATHOGENICを維持してください。 – Geroge

関連する問題