【发布时间】:2020-12-03 00:01:10
【问题描述】:
我有一个问题与有关该主题的许多其他问题非常相似,但我无法将这些解决方案扩展到我正在寻找的确切输出。
我有两个格式为 fastq 样式的文件,如下所示:
file1.txt
@header:with:id:number:0001 1:this:number:indicates:pair:number
ABCD
+
1324
@header:with:id:number:0001 2:this:number:indicates:pair:number
EFGH
+
5678
@header:with:id:number:0002 2:this:number:indicates:pair:number
PQRS
+
9012
@header:with:id:number:0003 1:this:number:indicates:pair:number
IJKL
+
3456
@header:with:id:number:0003 2:this:number:indicates:pair:number
MNOP
+
7890
file2.txt
@header:with:id:number:0004 1:this:number:indicates:pair:number
QRST
+
1324
@header:with:id:number:0004 2:this:number:indicates:pair:number
UVWX
+
5678
@header:with:id:number:0005 1:this:number:indicates:pair:number
CDEF
+
3456
@header:with:id:number:0005 2:this:number:indicates:pair:number
GHIJ
+
7890
@header:with:id:number:0002 1:this:number:indicates:pair:number
YZAB
+
9012
每个“块”有四行,其中第一行(标题)始终以 @ 开头,并包括一个 id 编号(例如 0001)和一个索引(即在“空格”之后的 1 或 2)。 每个 id 编号应该在具有两个索引的同一个文件中出现两次(就像上面示例中除 0002 之外的所有 id 编号一样)。 现在我想分别存储 id-number 出现在两个文件中的块(表示每个文件中只出现一次的块)。
在这种情况下,输出应该是:
@header:with:id:number:0002 1:this:number:indicates:pair:number
PQRS
+
9012
@header:with:id:number:0002 2:this:number:indicates:pair:number
YZAB
+
9012
并且这些行应该从原始文件中删除。
为此,到目前为止,我已将 awk 与以下命令一起使用
awk -F" " '/^@/ && NR==FNR {lines[$1]; next}
$1 in lines {x=NR+3}
(NR<=x) {print $0}' file2.txt file1.txt
这个输出:
@header:with:id:number:0002 2:this:number:indicates:pair:number
PQRS
+
9012
到一半。
我的问题是,如何在 两个 文件中出现的标头中搜索 id 编号,将它们存储在第三个文件中并从两个原始文件中删除相应的块?
【问题讨论】:
-
这是fastq 格式吗?如果您明确指出这种格式,您就更有可能接触到使用这种格式的人。
-
听起来真的很想打印并删除 ID 仅在文件中出现一次的块 - 这比比较两个文件中的 ID 以找出两个文件中出现的 ID 更简单如果这将始终是相同的 ID,在一个文件中只出现一次。
-
@EdMorton 理想情况下,一个 id 号在同一个文件中出现两次,一次是索引 1,一次是索引 2。但是如果其中一个索引丢失,则预计它会出现在另一个文件中因此,id-numbers 出现在两个文件中。 (这是由于下游处理步骤中的一些不确定性,这些块应该被区别对待,因此我想将它们分开)。希望这能澄清你的问题。
-
@tripleee 是的,这确实是 fastq 格式。感谢您的提示,我会更新问题以明确提及这一点。
-
@MostlyHarmless 是的,这就是您在问题中所描述的。我的观点是,找到一个在文件中出现一次的 ID 并从该文件中删除相关记录比找到两个文件中都出现的 ID 然后从每个文件中删除记录更容易,那么为什么不改为你的要求呢?