我有一个这样的文本文件:
@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
你知道怎么解决吗?
答案 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