【发布时间】:2015-01-19 15:10:10
【问题描述】:
我有一个文件,您要在其中删除按模式匹配的行并删除上面和下面的字符串。
举例:
FFFFIFIBBFFFFFFFFFFFFFBBBBFBBBBFBBBB77<<BBBBBB7B<BBBBBB<B<
@HISEQ:102:h9u5badxx:1:1101:13002:2147 1:N:0:CTGT
GATCCCCGTCTATCAGATACACGTTACTCAGCTAGTGCGAATGCGAACGCGAAATTTT
+
FFFFFFFFBBFFFFFFFFFFFFFBFBFFFFFFFFFBFFFBFFFFFBFFFFFFFFFBFB
@HISEQ:102:h9u5badxx:1:1101:15368:2194 1:N:0:CTGT
+
FFIFBFFIFFBBBFFFFFFFBBFFBFFBBBFFFBB7BBBBBBFFFBB700<7770<BBB0<0<BFFBFBFFFFF
@HISEQ:102:h9u5badxx:1:1101:19167:2169 1:N:0:CTGT
GATCTCATATAGGGCAGCGTGGTCGCGGC
我想删除不包含核苷酸序列的第二个块。
最终结果:
`FFFFIFIBBFFFFFFFFFFFFFBBBBFBBBBFBBBB77<<BBBBBB7B<BBBBBB<B<
@HISEQ:102:h9u5badxx:1:1101:13002:2147 1:N:0:CTGT
GATCCCCGTCTATCAGATACACGTTACTCAGCTAGTGCGAATGCGAACGCGAAATTTT
+
FFIFBFFIFFBBBFFFFFFFBBFFBFFBBBFFFBB7BBBBBBFFFBB700<7770<BBB0<0<BFFBFBFFFFF
@HISEQ:102:h9u5badxx:1:1101:19167:2169 1:N:0:CTGT
GATCTCATATAGGGCAGCGTGGTCGCGGC
`
与此块匹配的模式
'^.+$(\n)^(@HISEQ).*$(\n)^\+'
适用于 perl 和 javascript,但不适用于 sed。
因为 sed 不适用于换行符。
我找到了解决办法
sed -e ':a;N;$!ba;s/\n/ /' test
但是此代码将换行符替换为空格。如果在此代码中插入我的正则表达式:
sed -e ':a;N;$!ba;/^.+$(\n)^(@HISEQ).*$(\n)^\+/d' test
这不起作用。 你能帮我找到这个问题的解决方案吗?
我只是愚蠢。我误解了文件格式。 输入:
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA
+
JJJHIIJFIJJJJ=BFFFFFEEEEEEDDDDDDDDDDBD
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
如何编辑常规 exp 以获得你想要的
输出:
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
【问题讨论】:
-
sed一次处理一行。使用awk或perl可能会更好,这样可以更轻松地处理更大的块。 -
“将插入符号替换为空格”是什么意思?您的文件中没有插入符号。
-
对不起我的英语。我的意思是换行符,而不是插入符号
-
不使用修饰符的更好的正则表达式是
.+$\r?\n@HISEQ.*$\r?\n\+\s* -
awk这对我来说太难了。我不明白 awk 的逻辑。