我根据评论修改了问题。
我想匹配两个文件:如果文件1中的$4在文件2中的$3和$4范围内,我将打印文件1和文件2中的$6。如果没有匹配项,我将在输出中打印NA。如果有重叠范围,我将打印第一个匹配项(基于文件1的$4排序)。
档案一:
档案二:
18 16 8674587 8784575 + ABAT
10349 17 69148007 69244815 - ABCA10
23461 17 69244435 69327182 - ABCA5
输出量:
我根据以前的答案尝试了以下方法,但没有成功。输出是一个空文件。
awk 'FNR == NR { val[$1] = $4 }
FNR != NR { if ($1 in val && val[$1] >= $3 && val[$1] <= $4)
print $1, val[$1], $6
}' file1 file2 > file3
1条答案
按热度按时间hwamh0ep1#
假设条件:
'first'
匹配; OP还没有定义'first'
,所以我假设它是指file2
中各行出现的顺序(也就是行号)一个
awk
创意:**注意:**请记下输入文件的顺序;第一个答案(下面)是基于
file1 file2
的输入;此答案要求翻转输入文件的顺序,即file2 file1
这将生成:
**注:**以下内容基于OP的原始问题和预期输出(修订版#2); OP已经将预期输出修改到这样一种程度,即下面的答案不再有效...
假设条件:
file1
中,rs575272151 / 69244805
和rs544419019 / 69244469
均匹配来自file2
的2个不同(重叠)范围,但是OP在预期输出中仅示出了一组匹配;从这一点我会假设...file1
条目的匹配,就从任何附加匹配中移除所述条目;这将消除file1
条目的多个匹配项file2
的行的匹配,则停止寻找该行的匹配(即,转到来自file2
的下一个输入行);这将消除file2
的多个匹配一个
awk
创意:这将生成:
备注:
for (i in val)
构造以一致的方式处理数组条目;最终结果是,在存在多个匹配的情况下,我们简单地匹配由awk
提供的“第一”数组条目;如果for (i in val)
的这种“随机”性质是不可接受的,那么OP将需要用关于如何处理多个匹配的附加细节来更新问题rs575272151
和rs544419019
的赋值可以很容易地颠倒(由于for (i in val)
结构的性质)