我有一个超过 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