赛德。删除多行模式。正则表达式
Sed. remove multiline patterns. RegExp
我有严格格式的 fastq 文件。
输入文件:
@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###############
在上次 中,我解决了我的问题。但是我没有正确理解文件格式。我需要从输入文件中获取此文件:
输出:
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
我删除的地方不包含序列。
此脚本工作正常。但是我不会写正则表达式来得到你想要的
awk '/\n[GATC]*\n/' RS=+ ORS=+
脚本运行后我希望看到这个 output file. By this link 您将看到描述我要删除的行的表达式。
通过 perl。
$ perl -0777pe 's/[GATC]+\h*\n\K\+.*?[GATC]+\n//gs' file
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
但这会保留最后的空格。如果您还想删除尾随空格,请尝试以下操作。
$ perl -0777pe 's/[GATC]+\K\h*\n\+.*?[GATC]+\n/\n/gs' file
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
sed '/^@H/ { N; /\n+$/ { N; d } }' filename
其工作原理如下:
/^@H/ { # if the current line begins with @H
N # fetch the next one, append it.
/\n+$/ { # if the combined pattern has \n+ at the end (that is, if the new
# line is "+")
N # fetch another line
d # and discard the lot.
}
}
听起来你只需要:
$ awk -v RS= '{gsub(/(^|\n)@[^\n]+\n\+\n[^\n]+\n/,"")}1' file
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
即只需删除以“@”开头的任何字符串 ((^|\n)@
) 然后是一堆非换行符 ([^\n]+
) 然后是换行符之间的 +
(\n\+\n
) 然后是一堆其他非换行符以换行符结尾 ([^\n]+\n
)。如果任何行可以有前导或尾随白色space,那么只要在可能出现白色space的地方抛出一个[[:blank:]]*
。
我有严格格式的 fastq 文件。
输入文件:
@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###############
在上次
输出:
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
我删除的地方不包含序列。
此脚本工作正常。但是我不会写正则表达式来得到你想要的
awk '/\n[GATC]*\n/' RS=+ ORS=+
脚本运行后我希望看到这个 output file. By this link 您将看到描述我要删除的行的表达式。
通过 perl。
$ perl -0777pe 's/[GATC]+\h*\n\K\+.*?[GATC]+\n//gs' file
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
但这会保留最后的空格。如果您还想删除尾随空格,请尝试以下操作。
$ perl -0777pe 's/[GATC]+\K\h*\n\+.*?[GATC]+\n/\n/gs' file
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
sed '/^@H/ { N; /\n+$/ { N; d } }' filename
其工作原理如下:
/^@H/ { # if the current line begins with @H
N # fetch the next one, append it.
/\n+$/ { # if the combined pattern has \n+ at the end (that is, if the new
# line is "+")
N # fetch another line
d # and discard the lot.
}
}
听起来你只需要:
$ awk -v RS= '{gsub(/(^|\n)@[^\n]+\n\+\n[^\n]+\n/,"")}1' file
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA
+
IIIIFFF<?6?FAFEC@=C@1AE###############
即只需删除以“@”开头的任何字符串 ((^|\n)@
) 然后是一堆非换行符 ([^\n]+
) 然后是换行符之间的 +
(\n\+\n
) 然后是一堆其他非换行符以换行符结尾 ([^\n]+\n
)。如果任何行可以有前导或尾随白色space,那么只要在可能出现白色space的地方抛出一个[[:blank:]]*
。