在一个文件中替换一个字符串,并根据共同的字符串替换另一个文件的内容

时间:2018-08-14 12:17:02

标签: awk sed

我有两个文件。我想根据共同的字符串,用文件2的内容替换文件1中的某个字符串。

文件1

   Chr5 psl2gff exon    15907715    15907933    .   +   .   NM_001046410
   Chr2 psl2gff exon    8898358     8898394     .   +   .   NM_001192190

文件2

NM_001046410 gene_id TUBA1D; transcript_id tubulin, alpha 3d
NM_001192190 gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1

输出

  Chr5  psl2gff exon    15907715    15907933    .   +   .   gene_id TUBA1D; transcript_id tubulin, alpha 3d
  Chr2  psl2gff exon    8898358     8898394     .   +   .   gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1

在文件1中,有多个相同字符串的实例,但是,文件2仅具有一次。我希望在第一列匹配时将NM _ ****等的所有实例替换为文件2的内容。之后,我想从文件中完全删除NM _ ****。

我对bash等等还很陌生。我已经到处寻找一种方法来执行此操作,但到目前为止没有一个有效。此外,文件2中的行数超过5000行,文件1中的行数更多。

任何帮助将不胜感激!

谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个join操作。如果文件按连接键排序,并且空格不重要,则最简单

$ join -19 -21 file1 file2 | cut -d' ' -f2-

Chr5 psl2gff exon 15907715 15907933 . + . gene_id TUBA1D; transcript_id tubulin, alpha 3d
Chr2 psl2gff exon 8898358 8898394 . + . gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1

如果文件未排序并且空白很重要awk将是更好的解决方案

$ awk 'NR==FNR  {k=$1; $1=""; a[k]=$0; next} 
       $NF in a {sub(FS $NF"$",a[$NF])}1' file2 file1 

   Chr5 psl2gff exon    15907715    15907933    .   +   .  gene_id TUBA1D; transcript_id tubulin, alpha 3d
   Chr2 psl2gff exon    8898358     8898394     .   +   .  gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1

锻炼对您来说是了解代码。该站点上有很多示例(> 100)正是针对此问题的,并带有许多注释脚本,其中一些是我写的。