如果满足条件,则删除行和下一行

如果满足条件,则删除行和下一行

我有这样的文件,我使用 bash:

&ACLB032-06|Bos taurus|COI-5P|HM102290
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTATTCTATATCAACACTTATTC--------
&CYTC426-12|Bos taurus|atp6
ATGAACGAAAATTTATTTACCTCTTTTACCAATTCTAGAGTTTGCAGTAGCTATAATCCAAGCCTATGTATTCACTCTCCTAGTCAGCCTATATCTGCATGACAACACA
&CYTC426-12|Bos taurus|D-loop
AACACTATTAATATAGTTCCATAAATACAAAGCGCTTTCAATACTCAATTTAGCACTCCAAACAAAGTCAATATATAAACGCAGGCCCCCCCCCCC
&CYTC426-12|Bos taurus|COII
ATGGCATATCCCATACAACTAGGATTCCAAGCGGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAAAAATGATCTGCGTCAA
&CYTC426-12|Bos taurus|COI-5P|HQ184039
CATAAAGATATTGGTACCCTTTATCTAAAAAGTCTTCAGCTGATTAGCAACACTTCATGGAGGT
&CYTC426-12|Bos taurus|CYTB
ATGACTAACATTCGAAAGTCCCACCCACTACCTAGTGCTAATACCAACGGCCGGCACAGTCGAAAACAAATTACTAAAATGA

该文件可能包含一百万行,我只想保留包含字符串“COI-5P”的行及其后续行,这将导致以下结果

&ACLB032-06|Bos taurus|COI-5P|HM102290
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTATTCTATATCAACACTTATTC--------
&CYTC426-12|Bos taurus|COI-5P|HQ184039
CATAAAGATATTGGTACCCTTTATCTAAAAAGTCTTCAGCTGATTAGCAACACTTCATGGAGGT

但我很难找到解决方案。你能帮我吗?

答案1

你可以尝试(假设 GNU grep):

grep -A1 --no-group-separator 'COI-5P' file

手册grep页说:

上下文线控制

-A 编号,--after-context=编号

打印编号匹配行之后的尾随上下文行。--在连续的匹配组之间放置一条包含组分隔符 ( ) 的行。使用-o--only-matching选项,这不起作用并给出警告。

--no-group-separator

使用空字符串作为组分隔符。

测试:

$ cat file
&ACLB032-06|Bos taurus|COI-5P|HM102290
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTATTCTATATCAACACTTATTC--------
&CYTC426-12|Bos taurus|atp6
ATGAACGAAAATTTATTTACCTCTTTTACCAATTCTAGAGTTTGCAGTAGCTATAATCCAAGCCTATGTATTCACTCTCCTAGTCAGCCTATATCTGCATGACAACACA
&CYTC426-12|Bos taurus|D-loop
AACACTATTAATATAGTTCCATAAATACAAAGCGCTTTCAATACTCAATTTAGCACTCCAAACAAAGTCAATATATAAACGCAGGCCCCCCCCCCC
&CYTC426-12|Bos taurus|COII
ATGGCATATCCCATACAACTAGGATTCCAAGCGGGTCAAACCACAGTTTCATACCCATTGTCCTTGAGTTAGTCCCACTAAAGTACTTTGAAAAATGATCTGCGTCAA
&CYTC426-12|Bos taurus|COI-5P|HQ184039
CATAAAGATATTGGTACCCTTTATCTAAAAAGTCTTCAGCTGATTAGCAACACTTCATGGAGGT
&CYTC426-12|Bos taurus|CYTB
ATGACTAACATTCGAAAGTCCCACCCACTACCTAGTGCTAATACCAACGGCCGGCACAGTCGAAAACAAATTACTAAAATGA

$ grep -A1 --no-group-separator 'COI-5P' file
&ACLB032-06|Bos taurus|COI-5P|HM102290
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTATTCTATATCAACACTTATTC-----------
&CYTC426-12|Bos taurus|COI-5P|HQ184039
CATAAAGATATTGGTACCCTTTATCTAAAAAGTCTTCAGCTGATTAGCAACACTTCATGGAGGT

答案2

我用这段代码找到了解决方案:

awk '/COI-5P/{nr[NR]; nr[NR+1]}; NR in nr' oldfile > newfile

在哪里

  • /COI-5P/{nr[NR]; nr[NR+1]}记录匹配行和后续行
  • NR in nr选择并隐式打印记录的行。

相关内容