【问题标题】:Finding matches in 2 files and printing the field above the match在 2 个文件中查找匹配项并打印匹配项上方的字段
【发布时间】:2019-05-10 18:18:04
【问题描述】:

文件1:

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:

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)

这里的目标是获取第一个文件第一列的每个数字,并查看该数字是否出现在第二个文件中。如果是,我想在 file2 中打印匹配项正上方的行:“/locus_tag”

例如,如果在 file1 中我们有 6864294,并且这个数字也出现在 file2 上,那么我想打印:/locus_tag="HCH_06747"

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个专为专业和热情的程序员准备的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。
  • 请将该示例输入的所需输出添加到您的问题中。
  • 我已经编辑了我的问题。我真的被卡住了,因为我知道我必须用 awk 来做这件事,但我仍然对此感到不安......
  • 您的第二个文件是既定的生物信息学格式吗?如果有,是哪一个? (这有点像部分 genbank 记录...)
  • 如果是这样,您要查找的数字是否只会出现在补码标签中?

标签: linux bash shell awk scripting


【解决方案1】:

这是一个粗略的示例:

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"

【讨论】:

  • 这看起来不错!谢谢!不过,这段代码也会打印出 DNA 序列。我明白了:/locus_tag="HCH_00354" FRPTPTYSLHRIEHPAFRQAIANFLDEERAGVSEYMRDANAHLPFKQVE" /locus_tag="HCH_00355" NQFNKALRKTYESGEAREILAQRGLESVM" /locus_tag="HCH_00356" VDDNDGNDDSDEGNSGGDTNKGKDDGGGSLGLLSILALLTMRFARRRPM"
  • 当然。如果在a 中找到匹配的数字字符串,它会打印上一行(在p 中)。
【解决方案2】:

试过了,我认为它会起作用:

for i in $(cat file1 | awk -F " " '{print $1 '\n'; print $2}')
do
        grep -m1 $i file2 -A1 | tail -1

done

【讨论】:

  • 这正是我想要的。惊人的。您能否简单地解释一下带有标签的代码?我真的很感激!
  • 您好,不客气。所以 awk 语句只是使用 " " 标记分隔每一行中的两个数字。然后,我使用 file1 中的数字对 file2 内容进行 grep,仅指定第一个结果 (-m1),并在文件 (-A1) 中取其上方的行。这给我留下了两行,tail -1 是你要找的那一行。
  • 这个答案包含几个错误和反模式。考虑到各种输入和/或环境值,它会非常缓慢并且神秘地失败。即使没有,您当然也不需要 shell 循环、4 个单独的命令和 2 个管道来完成这项任务!您可能匆忙选择此作为答案,并有效地告诉其他人不要费心发布其他答案,这可能包括正确的方法。
  • 另外 - 这不会像您要求的那样打印匹配之后的行而不是之前的行吗?
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多