使用grep时如何去除“--”行分隔符

3

我正在使用以下命令将我的fastq文件拆分成两个单独的配对末端读取文件:

grep '@.*/1' -A 3 24538_7#2.fq >24538_7#2_1.fq
grep '@.*/2' -A 3 24538_7#2.fq >24538_7#2_2.fq

但是它在条目之间自动添加了一个--的行分隔符。因此,使我的fastq文件不适合进一步处理(因为它变成了无效的fastq格式)。所以,我想去掉行分隔符(--)。 PS: 我已经找到了Linux机器的答案,但我使用的是MacOS,那些方法在Mac终端上没有用。

5
欢迎来到 SO Akhil。你需要在你的帖子中提到三个重要的事情,包括1.样本输入,2.所有条件下的预期输出示例,以及3.解决问题所做的努力(是否正确并不重要,因为我们都在这里学习)。祝愉快学习! - RavinderSingh13
1
如果你按照Ravinder的要求做,那么我们可以向你展示awk解决方案,它将是简洁、清晰、简单、高效并且可在任何UNIX系统上运行。 - Ed Morton
2个回答

3
您可以使用--no-group-separator选项来抑制它(在GNU grep中)。
另外,您也可以使用(GNU)sed:
sed '\|@.*/1|,+3!d'

删除除匹配@.*/1和后三行之外的所有行。

对于macOS的sed,您可以使用以下命令:

sed -n '\|@.*/1|{N;N;N;p;}'

但是对于更多的上下文行,这很快变得难以处理。


它显示 sed: 1: "\|@.*/1|,+3!d": 预期上下文地址,而新的输出文件仍然包括组分隔符。 - iamakhilverma
@AkhilVerma 嗯,我使用GNU sed,macOS sed 给了我同样的消息。让我添加一个适用于macOS sed的解决方案。 - Benjamin W.
是的,现在它可以工作了。但是将 sed 命令与 grep 集成在一起不起作用,相反,如果我先从 grep 生成一个文件,然后再对其使用 sed,它就可以工作了。谢谢 :) - iamakhilverma
@AkhilVerma 你应该能够使用sed命令代替grep命令,所有的行过滤都应该在sed中完成。 - Benjamin W.
是的,如果我只使用 sed,它可以工作。非常感谢 :) - iamakhilverma

1

另一种方法是将grep与自身链接:

grep '@.*/1' -A 3 file.fq | grep -v "^--"

第二个grep选择以--开头的不匹配(-v)行(尽管有时这个模式可以被解释为命令行选项,需要一些奇怪的转义,比如"[-][-]",这就是为什么我在那里放了^)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接