跨行查找字符串并替换为空

时间:2017-11-07 17:36:25

标签: regex macos sed

我有一些' fastq'格式化DNA序列文件(基本上只是文本文件),如下所示:

@Sample_1
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
@
+
@
+
@Sample_4
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT

我的最终目标是将这些变成“快速”。格式文件,但要做到这一点,我需要摆脱中间的两个空序列。

修改

所需的输出如下所示:

@Sample_1
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT
@Sample_4
ACTGACTGACTGACTGACTGACTGACTG
ACTGACTGACTGACTGACTGACTGACTG
+
BBBBBBBBBBBBEEEEEEEEEEEEEEEE
EHHHHKKKKKKKKKKKKKKNQQTTTTTT

我尝试的所有专用软件(Biopython,独立程序,其他人发布的perl脚本)都在空序列中崩溃。这实际上只是搜索字符串@\n+并将其替换为空的问题。我用Google搜索并阅读了几篇帖子,并尝试了大约一百万个选项,并且无法弄明白。以下是一些不起作用的事情:

sed s/'@'/,/'+'// test.fastq > test.fasta
sed s/'@,+'// test.fastq > test.fasta

任何见解都将不胜感激。

PS。我有一台Mac。

3 个答案:

答案 0 :(得分:2)

尝试:

sed "/^[@+]*$/d" test.fastq > test.fasta

/d option告诉sed"删除"匹配线(即不打印)。

^$表示"字符串的开头" "字符串结束"分别,即该行必须完全匹配。

所以,上面的命令基本上说:

  

打印所有的行只包含@+,并将结果写入test.fasta

编辑:我稍微误解了这个问题,对不起。如果你想删除一对连续的行,比如

@
+

然后您需要执行多行搜索并替换。

虽然这个可以完成sed,但它可能更容易使用类似perl脚本的内容:

perl -0pe 's/^@\n\+\n//gm' test.fastq > test.fasta
  • -0选项将Perl变为"文件slurp"模式,其中Perl一次性读取整个输入文件(而不是逐行)。这样可以进行多行搜索和替换。
  • -pe选项允许您运行Perl代码(在这种情况下进行模式匹配和替换)并显示命令行的输出。
  • ^@\n\+\n是要匹配的模式,我们无需替换(即删除)。
  • /gm使替换成为多线和全局。

您也可以将-i作为第一个参数传递给perl,以便内联编辑文件。

答案 1 :(得分:0)

这可能不是世界上最优雅的解决方案,但您可以使用tr将\n替换为null字符并返回。

cat test.fastq | tr '\n' '\0' | sed 's/@\x0+\x0//g' | tr '\0' '\n' > test.fasta

答案 2 :(得分:0)

试试这个:

sed '/^@$/{N;/\n+$/d}' file

找到@后,下一行将N附加到模式空间。 如果在下一行中找到$d命令将删除这两行。