这是基于前面的问题Awk条件过滤基于另一个(或其他解决方案)的一个文件
问题底部的快速摘要
我有一个awk程序,如果文本文件refGene.txt中的行中的值与另一个文本文件中的3个值中的2个匹配,它就会从该行中输出一列。
我需要包含一个额外的标准来查找两个文件之间的匹配。如果文件1中每行中指定的2个数值的范围与refGene.txt中一行中两个值的范围重叠,则包含该标准。文件1中的一行示例:
chr1 10 20
chr2 10 20
以及文件2中匹配列($3、$5、$6)的示例行(refGene.txt):
chr1 5 30
目前awk程序不将其视为匹配,因为尽管第一列不匹配,但第二列或第三列都不匹配。但我想用一种方法将其视作为匹配,因为文件1中的10-20区域在refGene.txt中的5-30范围内。然而,文件1中第二行应该不匹配,因为第一列不相匹配,这是必要的。如果有一种方法可以包括文件1中任何范围与refGene.txt中任何范围重叠的情况,那将非常有用(因此部分重叠也算作匹配)。它还应该替换下面的条件语句,因为它还可以找到下面描述的所有情况。
所以总结:如果出现以下情况,希望awk打印匹配项:文件1中的$1与文件2中的$3匹配AND:file1中$2-$3的范围与file2 中$5-$6的范围完全相交
如果我的问题不清楚,请告诉我。任何帮助都非常感谢,提前感谢!(解决方案不必在awk中)
卢布
FILES=/files/*txt
for f in $FILES ;
do
awk '
BEGIN {
FS = "t";
}
FILENAME == ARGV[1] {
pair[ $1, $2, $3 ] = 1;
next;
}
{
if ( pair[ $3, $5, $6 ] == 1 ) {
print $13;
}
}
' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ;
done
您只需要使用两个数组:
awk -F 't' '
NR == FNR {min[$1] = $2; max[$1] = $3; next}
($3 in min) && (min[$3] >= $5) && (max[$3] <= $6) {print $13}
'
NR==FNR
只是编写FILENAME == ARGV[1]
的另一种方式——它查看行号而不是文件名。