テキスト行の一部を次の行に移動するには?

テキスト行の一部を次の行に移動するには?

最初の行の一部と、次の行に追加のテキスト文字列を追加したい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

1行で始まる場合は、追加の行を@読みN、後でそれを返し、注文の要件に従って追加するために使用する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

その後、正しいfastq形式を維持するためにphred + 33を使用した品質スコアの拡張を含む、希望の出力を得ることができます。

@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

関連情報