Text 区域相交时两个文件之间的Awk匹配(欢迎任何解决方案)

Text 区域相交时两个文件之间的Awk匹配(欢迎任何解决方案),text,awk,filtering,intersect,Text,Awk,Filtering,Intersect,这是基于前面的一个问题 问题底部的快速总结 我有一个awk程序,如果一行中的值与另一个文本文件中的3个值中的2个相匹配,它会从文本文件“refGene.txt”中的行输出一列 我需要包括在两个文件之间查找匹配项的附加条件。如果文件1中每行中指定的2个数值的范围与refGene.txt中一行中的两个数值的范围重叠,则该标准为包含。文件1中的一行示例: chr1 10 20 chr2 10 20 以及文件2中匹配列($3、$5、$6)的示例行(refGene.txt): 目前,awk程序未将其视为

这是基于前面的一个问题

问题底部的快速总结

我有一个awk程序,如果一行中的值与另一个文本文件中的3个值中的2个相匹配,它会从文本文件“refGene.txt”中的行输出一列

我需要包括在两个文件之间查找匹配项的附加条件。如果文件1中每行中指定的2个数值的范围与refGene.txt中一行中的两个数值的范围重叠,则该标准为包含。文件1中的一行示例:

chr1 10 20
chr2 10 20
以及文件2中匹配列($3、$5、$6)的示例行(refGene.txt):

目前,awk程序未将其视为匹配,因为尽管第一列与第二列或第三列均不匹配,但我希望能将其视为匹配,因为文件1中的区域10-20在refGene.txt中的范围为5-30。但是,文件1中的第二行不应该匹配,因为第一列不匹配,这是必需的。如果有一种方法可以包括文件1中的任何范围与refGene.txt中的任何范围重叠的情况,这将非常有用(因此部分重叠也被视为匹配)。 它还应取代以下条件陈述,因为它还将发现目前描述的所有情况

因此,总结如下: 如果出现以下情况,希望awk打印匹配项: 文件1中的$1与文件2中的$3匹配,并且: 文件1中$2到$3的范围与文件2中$5到$6的范围完全相交

如果我的问题不清楚,请告诉我。非常感谢您的帮助,提前谢谢!(解决方案不必在awk中)

鲁巴尔


您只需要使用2个阵列:

awk -F '\t' '
  NR == FNR {min[$1] = $2; max[$1] = $3; next}
  ($3 in min) && (min[$3] >= $5) && (max[$3] <= $6) {print $13}
'
awk-F'\t''
NR==FNR{min[$1]=$2;max[$1]=$3;next}

($3最小值)和&(最小值[$3]>=$5)和&(最大值[$3]您只需要使用两个数组:

awk -F '\t' '
  NR == FNR {min[$1] = $2; max[$1] = $3; next}
  ($3 in min) && (min[$3] >= $5) && (max[$3] <= $6) {print $13}
'
awk-F'\t''
NR==FNR{min[$1]=$2;max[$1]=$3;next}

($3最小值)和&(最小值[$3]>=$5)和&(最大值[$3]您好,谢谢。它似乎没有捕获所有案例。第二个文件中的对应列与第一个文件中的列号不同。从文件1到文件2的对应关系是$1=$3,$2=$5,$3=$6。这可能是它不起作用的原因吗?如果必须将此代码集成到现有脚本中,请随意编辑我上面的脚本awk.使用FNR==NR而不是FILENAME==ARGV[1]通常是正确的,但是如果第一个文件是空的,则行为会有所不同,因此OP认为可能会发生这种情况?对于OP-去掉所有这些空语句(尾随分号)从awk脚本和shell脚本中,将文件更改为文件,因为按照惯例,导出的变量名保留了所有大写字母,并引用shell变量以避免令人不快的意外。您好,谢谢。它似乎并没有捕获所有情况。第二个文件中的对应列不是同一列mber与第一个相同。从文件1到文件2的对应关系是$1=$3,$2=$5,$3=$6。这可能是它不工作的原因吗?如果必须将此代码集成到现有的awk中,请随意编辑我上面的脚本。使用FNR==NR而不是FILENAME==ARGV[1]通常是正确的,但是如果第一个文件是空的,行为会有所不同,所以OP认为可能会发生这种情况?对于OP-去掉所有的空语句(后面的分号)从awk脚本和shell脚本中,将文件更改为文件,因为按照惯例,导出的变量名保留了所有大写字母,并引用shell变量以避免将来出现令人不快的意外情况。
awk -F '\t' '
  NR == FNR {min[$1] = $2; max[$1] = $3; next}
  ($3 in min) && (min[$3] >= $5) && (max[$3] <= $6) {print $13}
'