我有以下格式的文本文件
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之间的所有那些项目。我认为问题出在我的条件语句中,因为将其删除后即可成功打印。谁能建议出什么问题了?
编辑:发布了一个不好的例子,我确实有一些应该通过过滤但没有通过的项目。
答案 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}}。如果这也可能是另一个问题,那就再想想。