bash - 如何用两列替换文件中的字符串?
问题描述
我的文件内容如下所示:(由“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
解决方案
awk
or perl
or 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
,并且我很难粘贴到选项卡中。)
推荐阅读
- node.js - MongooseError:`openUri()` 的 `uri` 参数必须是字符串,得到“未定义”。确保 `mongoose.connect()` 的第一个参数是一个字符串
- python - 如何使用 python pandas 为 pdf_export 制作表格
- python - 解析网页时无法提取单行
- java - 如何用一维数组中的值填充二维数组?
- c - 嵌入式 C 中的 __forceinline
- vue.js - Vue:有条件地允许基于另一个道具的值的道具类型
- qt - QNetworkAccessManager 是否支持 HTTPS 代理?
- python - 我正在尝试将来自爬虫的信息放入 json 文件中,但是当我添加新对象时出现 json 多个顶级错误,我该如何解决这个问题?
- react-native - 在本机反应中不导航到特定屏幕
- azure - 添加的客户端 IP 不会保留在 Azure 服务器防火墙设置中