awk更新file1中一行匹配file2中另一行的部分

时间:2018-08-17 17:35:48

标签: awk

在下面的awk中,我仅尝试更新file2中以>开头的行,其中$2中的file1在第二个之后匹配_。如果是,则用$1中的file1更新该部分。我还尝试在更新后删除该字段中的最后一个_,但是我不确定如何删除。 awk已执行,但目前我已打印所有file1file2。如果仅打印,则可以看到仅搜索>行,但是不确定。可能并不总是存在匹配,并且不需要进行任何处理。谢谢:)。

file1 space delimited

SCN1A NM_001165963.1
SCN1B NM_001037.4

文件2 space delimited

 >hg19_ncbiRefSeq_NM_001165963.1_2 range=chr2:166912896-166913035 5'pad=25 3'pad=25
 ....
 ....
 >hg19_ncbiRefSeq_NM_001165963.1_4 range=chr2:166909337-166909478 5'pad=25 3'pad=25
 ....
 ....

所需的输出

>hg19_ncbiRefSeq_SCN1A range=chr2:166912896-166913035 5'pad=25 3'pad=25
....
....
>hg19_ncbiRefSeq_SCN1A range=chr2:166909337-166909478 5'pad=25 3'pad=25
....
....

awk

awk '/^>/; {a[$2]=$1; next} a[$1]{$1=a[$1]}1' file1 file2

评论了awk

awk '
FNR==NR{  # process same line
 a[$2]=$1  # use $2 to and store $1 in a
   next    # process next line
}
  />/{  # each line starting with >
   for(i in a){  # start loop
   value=""
    if(match($0,i)){   # look for match in i 
    value=substr($0,RSTART+RLENGTH)  # store match in value
      sub(/^_[0-9]+ /,"",value)   # update the NM_digits only
     print substr($0,1,RSTART-1) a[i],value  # print the updated i with portion below
      next  # process next line
    }
  }
}
 1   # update output
 ' 

1 个答案:

答案 0 :(得分:1)

请您尝试以下。

awk '
FNR==NR{
   a[$2]=$1
   next
}
/>/{
   for(i in a){
     value=""
     if(match($0,i)){
       value=substr($0,RSTART+RLENGTH)
       sub(/^_[0-9]+ /,"",value)
       print substr($0,1,RSTART-1) a[i],value
       next
     }
   }
}
1
' Input_file1   Input_file2

示例输入的输出如下所示。

 >hg19_ncbiRefSeq_SCN1A range=chr2:166912896-166913035 5'pad=25 3'pad=25
 ....
 ....
 >hg19_ncbiRefSeq_SCN1A range=chr2:166909337-166909478 5'pad=25 3'pad=25
 ....
 ....