我有来自 RNA 测序的 fastq 文件,我想将其中第一行的一部分和额外的文本字符串附加到下一行。
这些是我的文件的前 8 行:
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCT
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGA
+
F:FFFGF?FGGFFFFGFFEE
我想将从 @ 开始的每一行复制 # 和 /1 之间的部分到下一行的末尾,然后是字符串AGTCGGAGGC。结果应该是:
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATGAGTCGGAGGC
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGAAGTCGGAGGC
+
F:FFFGF?FGGFFFFGFFEE
我检查了如何查找文本、复制它并插入到文件的下一行?,但在该示例中插入新行而不是附加到现有行。我也尝试了以下操作,但我无法弄清楚如何将搜索到的字符串附加/复制到(已经存在)的末尾下一个线。
sed -E 's%#(.*)/%$\1AGTCGGAGGC%g' test3.txt > test3new.txt
答案1
$ cat tst.awk
str != "" { $0 = $0 str "AGTCGGAGGC"; str="" }
match($0,"#.*/") { str = substr($0,RSTART+1,RLENGTH-2) }
{ print }
$ awk -f tst.awk file
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATGAGTCGGAGGC
+
FFDFFFFFFFFGFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGAAGTCGGAGGC
+
F:FFFGF?FGGFFFFGFFEE
答案2
使用sed
:
sed -E '/^@/{ N; s/^(.*)#(.*)\/1(.*)/\1#\2\/1\3\2AGTCGGAGGC/; }' infile
如果以一行开头,@
则读取N
ext 行并捕获 3 个组,稍后我们将使用它们根据您的订单要求返回它们并附加2AGTCGGAGGC
。
答案3
我建议你结合使用 awk 和序列套件。以下命令将数据转换为更易于操作的制表符分隔文件,然后将其恢复为 fastq。
seqkit fx2tab text.fq | awk '{ tag=$1; gsub(/(^.*#)|(\/1$)/,"" , tag); print $1 "\t" $2 tag "\t" $3 "FFFFFFFFFF"}' | seqkit tab2fx
然后,您将获得所需的输出,包括使用 phred+33 进行质量分数的扩展,以保持正确的 fastq 格式:
@V300088128L1C001R0010000004#TCCTCGCATG/1
TTCAAGTAATCCAGGATAGGCTTCCTCGCATG
+
FFDFFFFFFFFGFFFFFFFFFFFFFFFFFFFF
@V300088128L1C001R0010000019#CTGATATAGA/1
GTGGATCACTTGGCTCGGGACTGATATAGA
+
F:FFFGF?FGGFFFFGFFEEFFFFFFFFFF
如果您的标签大小可变,您可以根据找到的代码使用以下变体这里:
seqkit fx2tab text.fq | awk ' function str_repeat(s1, n1) {s2 = ""; for (n2 = 1; n2 <= n1; n2++) {s2 = s2 s1} return s2 }; {tag=$1; gsub(/(^.*#)|(\/1$)/,"" , tag); print $1 "\t" $2 tag "\t" $3 str_repeat("F", length(tag)) }'
答案4
使用GNU sed
扩展正则表达式模式,-E
我们将下一行粘贴到 @ 行,除非它是最后一行。然后我们抓取 # 和 /1 之间的文本,并在正则表达式中放入 \n 以确保其来自 @ 行,并将其粘贴到模式空间的末尾。
sed -Ee '
/@/{$!N;}
s|#(.*)/1.*\n.*|&\1AGTCGGAGGC|
' file