我有一个包含 3 列的多行文件,如下所示:
col1 set=SamSNP;ANNOVAR_DATE=2015-04-15;Func.ensGene=exonic;Gene.ensGene=ENSCAFG00000000009.3;ANNOVAR_DATE=2015-04-15;Func.ensGene=exonic;GeneDetail.ensGene=.;ALLELE_END GT:PL
我需要删除从“ANNOVAR_DATE”开始的文本,直到第 3 列中下一次出现“ANNOVAR_DATE”。所需的输出如下所示:
col1 set=SamSNP;ANNOVAR_DATE=2015-04-15;Func.ensGene=exonic;GeneDetail.ensGene=.;ALLELE_END GT:PL
在 linux 中有什么解决方案吗?
这里有一个使用 sed 的方法
sed -e 's/\(.*\)\(ANNOVAR_DATE=[^;]*;\).*ANNOVAR_DATE=*[^;]*;\(.*\)/\1\2\3/' <filename>
这会将行分成 4 个部分:
a) ANNOVAR_DATE 之前的所有字符,
b) ANNOVAR_DATE 部分的第一个实例,
c) 直到并包括 ANNOVAR_DATE 的下一个实例的所有内容
d) 线路的其余部分。
'c'被丢弃,a、b、d被存储并打印。
\(.*\)
存储为 \1
\(ANNOVAR_DATE=[^;]*;\)
这部分,包括实际日期和分号存储为 \2
.*ANNOVAR_DATE=*[^;]*;
这将选择下一个 ANNOVAR_DATE 部分之前的所有内容并将其丢弃
最后,\(.*\)
将该行的其余部分存储为 \3
我是一名优秀的程序员,十分优秀!