Awk 将一个文件中的字符串替换为基于公共字符串的另一个文件的内容

Awk 将一个文件中的字符串替换为基于公共字符串的另一个文件的内容,awk,sed,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

我有两个文件。我想用基于公共字符串的文件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中还有更多行

任何帮助都将不胜感激


谢谢。

这是一个
加入操作。如果文件按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)就是针对这个问题的,并且有很多评论脚本,其中一些是我写的。

请在你的帖子中也加上你的努力。@RavinderSingh13供参考,我看到关于jww效应的报道被作为一个副本关闭了,所以我添加了一条评论,只是为了反驳jww的说法,即他的行为是可以接受的。不过这不会有什么结果,所以我不会再投入更多的精力了。@EdMorton,当然感谢Ed先生的支持,现在完全泄气了,被打了很多次:(是的,很有趣,这么说是一个友好的网站,你在Meta中问了一个问题,却被彻底摧毁了:-)。有一次我也在那里发布了一个问题——这是一个小团体。@RavinderSingh13——我想你会发现这很有趣——有人创建了一个工具,在那里你可以知道jww评论了哪些帖子你参与了,这样你就可以在你被否决时知道他参与了!当然,它不能告诉你他只是在没有评论的情况下否决了所有人的投票,但这很有趣……谢谢,我已经尝试使用在这里和其他地方找到的类似代码,我似乎无法让它们工作。我将尝试使用您发布的这个awk命令。你是对的,我必须理解它——这是我不知道的。如果脚本中的某个部分看起来很难理解,你可以随时询问,但一旦你知道每个关键字的含义,大部分内容都很琐碎……这非常有效,谢谢。事实证明,我的文档的格式化需要一个快速的column-tfile1,然后是您的命令。