新しい文字列「title」が表示されるまで、別の行の前に文字列「title」を入れることはできますか? awk、sed、Perlなどを使用して再帰問題を解決しました。

新しい文字列「title」が表示されるまで、別の行の前に文字列「title」を入れることはできますか? awk、sed、Perlなどを使用して再帰問題を解決しました。

次のコンテンツを含む100万行を超えるtxtファイルがあります(Match_nと「cggggg」の間のタブ)。

Sequence_1
Match_1 cggggg
Match_2 gggggc
Match_3 ggggcc
Match_4 cgggcc
Match_5 agggca
Match_6 agggta
Sequence_2
Match_1 tgggca
Match_2 aggggg
Match_3 gggggc
Match_4 ggggca
Sequence_3
Match_1 cggggt
Match_2 ggggtt
Match_3 tgggga
Match_4 ggggac
Match_5 cggggc

次の形式が必要です。

Sequence_1  Match_1 cggggg
Sequence_1  Match_2 gggggc
Sequence_1  Match_3 ggggcc
Sequence_1  Match_4 cgggcc
Sequence_1  Match_5 agggca
Sequence_1  Match_6 agggta
Sequence_2  Match_1 tgggca
Sequence_2  Match_2 aggggg
Sequence_2  Match_3 gggggc
Sequence_2  Match_4 ggggca
Sequence_3  Match_1 cggggt
Sequence_3  Match_2 ggggtt
Sequence_3  Match_3 tgggga
Sequence_3  Match_4 ggggac
Sequence_3  Match_5 cggggc

追加情報:合計10.000個の「Sequence_N」があり、各シーケンスには異なる「Match_n cggggc」数があります。

ありがとうございます! !

答え1

awk -v OFS='\t' 'NF==1{seq=$0; next} {print seq, $0}' file

答え2

Sequencesedを使用すると、出会うすべての文字列を予約済みスペースに移動してから取り出すことができます。

sed -e '/^Sequence/{h;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2\t\1/' file

Sequence- の先頭位置を取得するには、いくつかの再配置が必要ですMatchが、とにかく改行区切りを変更するために必要な交換にそれを組み込むことができます。

答え3

Perlを使用すると、次のことができます。

$ perl -nlE '
  /^Seq/ ? ($h=$_) : say("$h\t$_")
' file

そしてsedを使用してください:

$ sed -ne ':a
    /^Seq/{h;N;}
    /\nSeq/D
    s/\n/\t/p;g;$!ba
' file

関連情報