我有一个包含三列的多行文件,如下所示:
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