使用awk拆分过滤

时间:2018-12-04 23:31:51

标签: bash awk

我有以下格式的文本文件

build:chr:pos sample_1 sample_2 ...
38:1:189665   1        1
38:1:416546   0        0        ...
38:1:9000     0        1        ...
...           ...      ...      ...

我正在尝试根据第一列中包含的每个项目的pos对其进行过滤。我的想法是,使用awk的split可以抓取包含pos的子字符串,并根据给定的阈值对其进行过滤。这是我目前的awk声明

awk -v upper_bound=100000 -v lower_bound=100 
'{
   split($1,a,":");
   if (a[3] < upper_bound && a[3] >= lower_bound) 
      print $0
}'

,当前正在产生空输出。它应打印出pos在100-100000之间的所有那些项目。我认为问题出在我的条件语句中,因为将其删除后即可成功打印。谁能建议出什么问题了?

编辑:发布了一个不好的例子,我确实有一些应该通过过滤但没有通过的项目。

2 个答案:

答案 0 :(得分:1)

使用多个定界符(空格和冒号)的简单awk命令:

awk -F"[: ]" -v lower_bound=100 -v upper_bound=100000 'lower_bound<=$3 && $3<=upper_bound' filename

答案 1 :(得分:0)

正如dwag在他的评论中已经提到的那样,您显示的示例没有任何行满足您的条件,因此您看不到输出中的任何内容。我还修复了2件事(为'{的第一块添加了{st:awk的位置,为更安全的一面为{添加了第二个:if}。

我还测试了您的代码(在应用了上面提到的一些细微变化之后),另外还有1行如下所示,假设下面是Input_file。

cat Input_file
build:chr:pos sample_1 sample_2 ...
38:1:189665   1        1
38:1:416546   0        0        ...
39:1:9999     1        2        ...
...           ...      ...      ...

现在,当我运行以下代码时,其输出如下:

awk -v upper_bound=100000 -v lower_bound=100 '{
   split($1,a,":");
   if (a[3] < upper_bound && a[3] >= lower_bound){
      print $0}
}'  file82836752
39:1:9999     1        2        ...

编辑: 1个想法,如果输入文件包含CONTROL M个字符(如果是),请检查cat -v Input_file的输入文件,然后尝试通过{ {1}}。如果这也可能是另一个问题,那就再想想。