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 行,所以这些行显然在输入文件中。
非常感谢您的帮助。
您可以尝试使用 perl instead of awk. The reason is that in perl 您可以创建数组哈希来保存 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
早上好,
很抱歉这个问题对某些人来说似乎微不足道。几个小时以来,它一直让我发疯。我的问题如下: 我有这两个文件:
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 行,所以这些行显然在输入文件中。
非常感谢您的帮助。
您可以尝试使用 perl instead of awk. The reason is that in perl 您可以创建数组哈希来保存 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