使用awk过滤数据

时间:2017-05-02 11:46:06

标签: bash shell awk sed

我有数据集,我想应用具有特殊条件的过滤器。我更喜欢awk解决方案,但接受任何其他bash解决方案。文件是标签分开的,输出也应该是标签sep。

文件1:

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。此外,我相信这种过滤可以在不进行翻录的情况下完成。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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     -