在bash中过滤复杂的文本文件

时间:2018-01-09 15:56:52

标签: bash

我有一个这样的文本文件:

@M00872:408:000000000-D31AB:1:1102:15653:1337 1:N:0:ATCACG
CGCGACCTCAGATCAGACGTGGCGACCCGCTGAATTTAAGCA
+
BCCBGGGGGGGGGGHHHHGGGGGGGGGGGGGGGHHHHHHHHH
@M00872:408:000000000-D31AB:1:1102:15388:1343 1:N:0:ATCACG
CGCGACCTCATGAATTTAAGGGCGACCCGCTGAATTTAAGCA
+
CBBBGGGGGGGGGGHHHHGGGGGGGGGGGGGGGHHHHHGHHH

每4行属于一个组,每组的第一行以@开头。 每组的第二行对我来说很重要,所以我想基于第二行过滤掉这些组。事实上,如果这个特定的序列" GATCAGACGTGGCGAC"在第二行中,我想删除整个组并创建一个包含其他组的新文件。 所以这个例子的结果是:

@M00872:408:000000000-D31AB:1:1102:15388:1343 1:N:0:ATCACG
CGCGACCTCATGAATTTAAGGGCGACCCGCTGAATTTAAGCA
+
CBBBGGGGGGGGGGHHHHGGGGGGGGGGGGGGGHHHHHGHHH

我尝试了以下命令,但它只返回第2行,只返回包含这段序列的行。但我想要整个小组,如果第二行不包含这个序列。

grep -i GATCAGACGTGGCGAC myfile.txt > output.txt

你知道怎么解决吗?

1 个答案:

答案 0 :(得分:2)

awk解决方案:

awk -v kw='GATCAGACGTGGCGAC' '/^@/{if (txt !~ kw) printf "%s", txt; n=4; txt=""} n-->0{
txt=txt $0 RS} END{if (txt !~ kw) printf "%s", txt}' file

@M00872:408:000000000-D31AB:1:1102:15388:1343 1:N:0:ATCACG
CGCGACCTCATGAATTTAAGGGCGACCCGCTGAATTTAAGCA
+
CBBBGGGGGGGGGGHHHHGGGGGGGGGGGGGGGHHHHHGHHH

替代grep + gnu awk解决方案:

grep -A 3 '^@' file | awk -v RS='--\n' -v ORS= '!/GATCAGACGTGGCGAC/'

@M00872:408:000000000-D31AB:1:1102:15388:1343 1:N:0:ATCACG
CGCGACCTCATGAATTTAAGGGCGACCCGCTGAATTTAAGCA
+
CBBBGGGGGGGGGGHHHHGGGGGGGGGGGGGGGHHHHHGHHH