如何将一行文本的部分内容移动到下一行?

如何将一行文本的部分内容移动到下一行?

我有来自 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

如果以一行开头,@则读取Next 行并捕获 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

相关内容