如何使用awk移除TSV文件指定列两个句点间的文本
处理orthologsClassification.tsv第4列格式方案
问题背景
需求为保留orthologsClassification.tsv文件其余列内容不变,仅删除第4列字段中两个句点之间的文本。
原文件内容示例:
t_gene t_transcript q_gene q_transcript ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.ZNF254.2177 ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.ZNF254.2637
期望处理后效果:
t_gene t_transcript q_gene q_transcript ENSG00000213096 ENST00000616028.ZNF254 reg_2133 ENST00000616028.2177 ENSG00000213096 ENST00000616028.ZNF254 reg_2053 ENST00000616028.2637
之前使用的命令存在逻辑问题:
awk '{sub(/\..*$/, "", $4)} 1' OFS='\t' orthologsClassification.tsv
该命令的正则/\..*$/会匹配第一个句点到字段末尾的所有内容,因此会把第4列第一个句点后的所有文本全部删除,例如ENST00000616028.ZNF254.2177会被错误处理为ENST00000616028,不符合预期。
正确实现命令
使用awk按列精准处理,命令如下:
awk 'BEGIN{FS=OFS="\t"} {sub(/\.[^.]+\./, ".", $4)} 1' orthologsClassification.tsv > corrected_orthologsClassification.tsv
命令逻辑说明
BEGIN{FS=OFS="\t"}:预先指定输入、输出的字段分隔符均为制表符,保证原文件的列分割格式不被破坏,其余列内容完全保留sub(/\.[^.]+\./, ".", $4):仅对第4列执行替换操作,正则匹配「第一个句点 + 两个句点之间的所有非句点字符 + 第二个句点」的片段,将其替换为单个句点,刚好实现删除两个句点中间文本的效果- 末尾的
1是awk的通用简写语法,等价于打印当前处理完成的所有行 - 处理结果默认输出到新文件
corrected_orthologsClassification.tsv,避免直接修改原文件导致数据丢失,确认结果符合预期后可再替换原文件。
内容的提问来源于stack exchange,提问作者Alexis Brown
相关产品推荐
相关产品推荐

