Linux 在2个文件中查找匹配项并打印匹配项上方的字段

Linux 在2个文件中查找匹配项并打印匹配项上方的字段,linux,bash,shell,awk,scripting,Linux,Bash,Shell,Awk,Scripting,文件1: 文件2: 2987571 2988014 4663633 4668876 4669084 4669827 4669873 4670130 4670212 4670604 4670604 4672469 4672502 4672621 4672723 4673088 4673102 4673518 4673521 4673895 4679698 4680174 5756724 5757680 5757937 5758506 5758855 5759202 5759940 5771528

文件1:

文件2:

2987571 2988014
4663633 4668876
4669084 4669827
4669873 4670130
4670212 4670604
4670604 4672469
4672502 4672621
4672723 4673088
4673102 4673518
4673521 4673895
4679698 4680174
5756724 5757680
5757937 5758506
5758855 5759202
5759940 5771528
5772524 5773063
5773005 5773106
5773063 5773452
5773486 5773776
5773836 5774189
这里的目标是获取第一个文件第一列中的每个数字,并查看该数字是否出现在第二个文件中。如果是,我想打印文件2中匹配项正上方的行:“/locus\u tag”

例如,如果文件1中有6864294,而文件2中也有这个数字,那么我想打印:/locus\u tag=“HCH\u 06747”

这是一个粗略的示例:

gene            complement(6864294..6865061)
                     /locus_tag="HCH_06747"
     CDS             complement(6864294..6865061)
                     /locus_tag="HCH_06747"
                     /codon_start=1
                     /transl_table=11
                     /product="hypothetical protein"
                     /protein_id="ABC33372.1"
                     /translation="MIKQLVRPLFTGKGPNFSELSAKECGVGEYQLRYKLPGNTIHIG
                     MPDAPVPARVNLNADLFDSYGPKKLYNRTFVQMEFEKWAYKGRFLQGDSGLLSKMSLH
                     IDVNHAERHTEFRKGDLDSLELYLKKDLWNYYETERNIDGEQGANWEARYEFDHPDEM
                     RAKGYVPPDTLVLVRLPEIYERAPINGLEWLHYQIRGEGIPGPRHTFYWVYPMTDSFY
                     LTFSFWMTTEIGNRELKVQEMYEDAKRIMSMVELRKE"
     gene            complement(6865197..6865964)
                     /locus_tag="HCH_06748"
     CDS             complement(6865197..6865964)
                     /locus_tag="HCH_06748"
                     /codon_start=1
                     /transl_table=11
                     /product="hypothetical protein"
                     /protein_id="ABC33373.1"
                     /translation="MIKQIVRPLFTGKGPNFSELNVKECGIGDYLLRYKLPGNTIDIG
                     MPDAPVPSRVNLNADLFDSYDPKKLYNRTFVQMEFEWWAYRGLFLQGDSGLLSKMSLH
                     IDVNRINPNSPLGGSDLESLETYLREDYWDYYEAEKNIDGVPGSNWQKRYDFDNPDEV
                     RAKGYIPVRRLVLVLLPEIYVKERINDVEWLHYSIDGEGIAGTNITYYWAYPLTNNYY
                     LTFSFRTTTELGRNEQRYQRMLEDAKQIMSMVELCKG"
     gene            complement(6865961..6867109)
                     /locus_tag="HCH_06749"
     CDS             complement(6865961..6867109)

尝试过这个,我认为它会起作用:

awk '
NR==FNR {                                    # hash file 1 to a
    a[$1]
    next
}
{
    q=$0                                     
    while(match($0,/[0-9]+/)) {              # find all numeric strings
        if((substr($0,RSTART,RLENGTH) in a)) # test if it is in a
            print p                          # and output previous record p
        $0=substr($0,RSTART+RLENGTH)         # remove match from record
        }
    p=q                                      # store current record to p
}' file1 file2

                     /locus_tag="HCH_06747"

欢迎来到SO。Stack Overflow是专业和热情的程序员的问答页面。在问题中添加您自己的代码。您至少需要显示您自己为解决此问题所做的研究量。请将该示例输入的所需输出添加到您的问题中。我已编辑了我的问题。我真的被困住了,因为我知道我必须用awk来做这件事,但我仍然对它感到不安……你的第二个文件是一个已建立的生物信息学格式吗?如果是,哪一个?(它看起来有点像一个部分genbank记录…)如果是的话,你要查找的数字是否只会显示在补码标记中?这看起来很不错!谢谢这个密码也可以打印出DNA序列。我明白了:/locus_tag=“HCH_00354”frptyslhriehpafrqaianfldeeragvseymrdanahlpfkqve”/locus_tag=“HCH_00355”NQFNKALRKTYESGEAREILAQRGLESVM”/locus_tag=“HCH_00356”vddndgdsddegnsgdtnkddgggsllsialltmrrrpm”“当然。如果在
a
中找到匹配的数字字符串,它将打印前一行(在
p
中)。这正是我想要的。太神了你能用hashtags简单地解释一下代码吗?我会非常感激的!嗨,不客气。因此,awk语句仅使用“”标记分隔每行中的两个数字。然后,我使用file1中的数字grep file2内容,只指定第一个结果(-m1),并在文件(-A1)中取它上面的行。这给我留下了两行,tail-1就是你要找的。这个答案包含几个bug和反模式。它将非常缓慢,并且在给定各种输入和/或环境值的情况下神秘地失败。即使没有,您也不需要一个shell循环、4个单独的命令和2个管道来完成此任务!你可能很匆忙地选择了这个作为答案,因此有效地告诉其他人不要麻烦发布其他答案,这些答案可能包括正确的方法。此外,这不会像你要求的那样在赛后打印一行而不是在赛前打印一行吗?
for i in $(cat file1 | awk -F " " '{print $1 '\n'; print $2}')
do
        grep -m1 $i file2 -A1 | tail -1

done