如何将字符串“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

使用 sed,您可以将Sequence遇到的每个字符串移动到保留空间中,然后将其拉出:

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

相关内容