桑达。如何删除与周围的模式和字符串匹配的行?

时间:2015-01-06 18:08:57

标签: regex bash sed

我有一个文件,您希望按模式删除行匹配,并删除上下字符串。

以示例:

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###############

4 个答案:

答案 0 :(得分:3)

要删除第二个块,您可以执行以下操作:

awk 'NR!=2' RS=+ ORS=+ input

但我怀疑你想要更像的东西:

awk '/[GATC]{5,}\n/' RS=+ ORS=+ input

awk '/\n[GATC]*\n/' RS=+ ORS=+ input

答案 1 :(得分:3)

如果我理解正确,那么

sed ':loop; N; /\n+/ ! { $ ! b loop }; /\n@HISEQ[^\n]\+\n+/ d' foo.txt

会奏效。具体如下:

:loop                    # in a loop
N                        # fetch more lines
/\n+/ ! { $ ! b loop }   # until one starts with + or is the last line
/\n@HISEQ[^\n]\+\n+/ d   # if the penultimate line of all that begins with @HISEQ,
                         # discard the lot.

最后一个模式使用的是在找到以+开头的第一行后立即检查的事实,因此它末尾的\n+唯一匹配最后一行的开头在街区。

答案 2 :(得分:2)

使用awk更容易进行此解析:

awk -v RS=+ -v ORS=+ '!/\n@HISEQ[^\n]*\n$/' file
FFFFIFIBBFFFFFFFFFFFFFBBBBFBBBBFBBBB77<<BBBBBB7B<BBBBBB<B<7BBBBFFFBBBBFBBBBBBBFBFFFFB<<
@HISEQ:102:h9u5badxx:1:1101:13002:2147 1:N:0:CTGT
GATCCCCGTCTATCAGATACACGTTACTCAGCTAGTGCGAATGCGAACGCGAAATTTT
+
FFIFBFFIFFBBBFFFFFFFBBFFBFFBBBFFFBB7BBBBBBFFFBB700<7770<BBB0<0<BFFBFBFFFFF<B<7<<BBBBFB0
@HISEQ:102:h9u5badxx:1:1101:19167:2169 1:N:0:CTGT
GATCTCATATAGGGCAGCGTGGTCGCGGC
+

答案 3 :(得分:1)

 sed '/FFFFFFFFBBFFFFFFFFFFFFFBFBFFFFFFFFFBFFFBFFFFFBFFFFFFFFFBFB/,/\+/ d' YourFile

应该足够了