我有数据集,我想应用具有特殊条件的过滤器。我更喜欢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.condition
和6.condition
。此外,我相信这种过滤可以在不进行翻录的情况下完成。
感谢您的帮助。
答案 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 -