首页 > 解决方案 > 如何用两列替换文件中的字符串?

问题描述

我的文件内容如下所示:(由“tab”分隔的两列)

Others  ___
Archaea ___
Archaea_Euryarchaeota   ___
Archaea_Methanomicrobia_o_RCII  ___
Bacteria1       ___
Bacteria2       ___
Bacteria;p__Acidobacteria;c__Holophagae;o__Holophagales;f__Holophagaceae;g__    g__
Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;__;__       ___
Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;f__;g__     g__
Bacteria;p__Acidobacteria;c__Sva0725;o__Sva0725;f__;g__ g__
Bacteria;p__Acidobacteria;c__[Chloracidobacteria];o__;f__;g__   g__
Bacteria;p__Acidobacteria;c__iii1-8;o__SJA-36;f__;g__   g__
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__;g__        g__
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__EB1017;g__  g__
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__Microthrixaceae;g__ g__
Bacteria;p__Actinobacteria;c__Actinobacteria;__;__;__   ___

我想做的是:

当我g__在第二列中找到时,我需要用第一列中最后找到的单词(在 p__ 或 c__ 或 o__ 或 f__ 或 g__ 之后)替换它。例如在行

Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__Microthrixaceae;g__ g__

g__在第二列中应替换为Microthrixaceae.

类似地,对于找到 when 的实例,___然后替换为第一列中最后找到的单词(在 p__ 或 c__ 或 o__ 或 f__ 或 g__ 之后)。非常感谢您的建议。谢谢!

输出应如下所示:

Others  ___
Archaea ___
Archaea_Euryarchaeota   ___
Archaea_Methanomicrobia_o_RCII  ___
Bacteria1       ___
Bacteria2       ___
Bacteria;p__Acidobacteria;c__Holophagae;o__Holophagales;f__Holophagaceae;g__ Holophagaceae    
Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;__;__       Solibacterales
Bacteria;p__Acidobacteria;c__Solibacteres;o__Solibacterales;f__;g__     Solibacterales
Bacteria;p__Acidobacteria;c__Sva0725;o__Sva0725;f__;g__ Sva0725
Bacteria;p__Acidobacteria;c__[Chloracidobacteria];o__;f__;g__   Chloracidobacteria
Bacteria;p__Acidobacteria;c__iii1-8;o__SJA-36;f__;g__   SJA-36
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__;g__        Acidimicrobiales
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__EB1017;g__  EB1017
Bacteria;p__Actinobacteria;c__Acidimicrobiia;o__Acidimicrobiales;f__Microthrixaceae;g__ Microthrixaceae
Bacteria;p__Actinobacteria;c__Actinobacteria;__;__;__   Actinobacteria

标签: bash

解决方案


awkor perlor evensed绝对是比 pure 更好的选择bash。这是一个perl解决方案:

perl -pe 's/(.*?)([a-z]__\[?)([A-Za-z0-9-]+)(\])?(;[a-z]?__)*(\t)([g_]__)/$1$2$3$4$5\t$3/' yourfilename

有关此工作原理的一些解释,请将鼠标悬停在此处突出显示的正则表达式字符串:https ://regex101.com/r/tLpMCG/1

(请注意,这里的正则表达式与此答案中的略有不同,因为我在这里使用了perl,但在那里我被迫使用php,并且我很难粘贴到选项卡中。)


推荐阅读