我有一个包含三列的多行文件,如下所示:

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”开始的文本,直到第三列出现下一个“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_日期之前的所有字符,
b)ANNOVAR_DATE part的第一个实例,
c)直到并包括下一个ANNOVAR_日期实例的所有内容
d)其他线路。
丢弃“c”,存储并打印a、b和d。
\(.*\)存储为\1
\(ANNOVAR_DATE=[^;]*;\)此部分(包括实际日期和分号)存储为\2
.*ANNOVAR_DATE=*[^;]*;这将选择所有内容,直到下一个ANNOVAR_日期部分并丢弃它
最后,\(.*\)将行的其余部分存储为\3

10-07 16:40