awk 条件在循环中始终为 TRUE

awk condition always TRUE in a 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 }')
    START=$(echo $interval | awk '{print }')
    STOP=$(echo $interval | awk '{print }')

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

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

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

returns >4000 行,所以这些行显然在输入文件中。

非常感谢您的帮助。

您可以尝试使用 instead of . The reason is that in 您可以创建数组哈希来保存 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 文件的 header。 @F 检查列数,push 创建数组散列。

你的测试数据不准确,因为none行被过滤掉了,我改成:

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