awk条件在循环中始终为TRUE

时间:2015-06-30 08:39:41

标签: bash awk while-loop

早上好,

对不起这个问题对某些人来说似乎微不足道。这让我疯了好几个小时。我的问题如下: 我有这两个文件:

head <input file>
SNP CHR BP A1 A2 OR P
chr1:751343 1 751343 A T 0.85 0.01
chr1:751756 1 751756 T C 1.17 0.01
rs3094315 1 752566 A G 1.14 0.0093
rs3131972 1 752721 A G 0.88 0.009
rs3131971 1 752894 T C 0.87 0.01
chr1:753405 1 753405 A C 1.17 0.01
chr1:753425 1 753425 T C 0.87 0.0097
rs2073814 1 753474 G C 1.14 0.009
rs2073813 1 753541 A G 0.85 0.0095

head <interval file>
1 112667912 114334946
1 116220516 117220516
1 160997252 161997252
1 198231312 199231314
2 60408994 61408994
2 64868452 65868452
2 99649474 100719272
2 190599907 191599907
2 203245673 204245673
2 203374196 204374196

我想使用bash脚本从输入文件中删除所有行,其中BP列位于输入文件中指定的时间间隔内,其中CHR列与间隔的第一列匹配文件。

以下是我一直在使用的代码(尽管欢迎使用更简单的解决方案):

while read interval; do
    chr=$(echo $interval | awk '{print $1}')
    START=$(echo $interval | awk '{print $2}')
    STOP=$(echo $interval | awk '{print $3}')

    awk '$2!=$chr {print} $2==$chr && ($3<$START || $3>$STOP) {print}' < input_file > tmp
    mv tmp <input file>
done <

我的问题是没有从输入文件中删除任何行。即使命令

awk '$2==1 && ($3>112667912 && $3<114334946) {print}' < input_file | wc -l

返回&gt; 4000行,因此这些行显然位于输入文件中。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用代替。原因是在中,您可以创建数组哈希以保存interval文件的数据,并在处理输入时更轻松地提取它,例如:

perl -lane '
    $. == 1 && next;
    @F == 3 && do {
        push @{$h{$F[0]}}, [@F[1..2]];
        next;
    };
    @F == 7 && do {
        $ok = 1;
        if (exists $h{$F[1]}) {
            for (@{$h{$F[1]}}) {
                if ($F[2] > $_->[0] and $F[2] < $_->[1]) {
                    $ok = 0;
                    last;
                }
            }
        }
        printf qq|%s\n|, $_ if $ok;
    };
' interval input

$.跳过interval文件的标头。 @F检查列数,push创建数组的哈希值。

您的测试数据不准确,因为没有过滤掉任何行,我将其更改为:

SNP CHR BP A1 A2 OR P
chr1:751343 1 751343 A T 0.85 0.01
chr1:751756 1 112667922 T C 1.17 0.01
rs3094315 1 752566 A G 1.14 0.0093
rs3131972 1 752721 A G 0.88 0.009
rs3131971 1 752894 T C 0.87 0.01
chr1:753405 2 753405 A C 1.17 0.01
chr1:753425 1 753425 T C 0.87 0.0097
rs2073814 1 199231312 G C 1.14 0.009
rs2073813 2 204245670 A G 0.85 0.0095

所以你可以运行它并获得结果:

SNP CHR BP A1 A2 OR P
chr1:751343 1 751343 A T 0.85 0.01
rs3094315 1 752566 A G 1.14 0.0093
rs3131972 1 752721 A G 0.88 0.009
rs3131971 1 752894 T C 0.87 0.01
chr1:753405 2 753405 A C 1.17 0.01
chr1:753425 1 753425 T C 0.87 0.0097