我需要在新行中打印第二列中的每个“单词”,并在每个新行中复制第一列中的文本。各列以制表符分隔,第二列中的所有“单词”均以“GO:”开头,并用空格分隔。此外,每行中有不同数量的“单词”,从一个到几十个。
例如
TRINITY_DN23871_c0_g1_i1 GO:0003735 GO:0005783 GO:0005829
TRINITY_DN6318_c1_g1_i1 GO:0004707 GO:0005524
所需输出
TRINITY_DN23871_c0_g1_i1 GO:0003735
TRINITY_DN23871_c0_g1_i1 GO:0005783
TRINITY_DN23871_c0_g1_i1 GO:0005829
TRINITY_DN6318_c1_g1_i1 GO:0004707
TRINITY_DN6318_c1_g1_i1 GO:0005524
我尝试过使用 awk
awk -v RS=" " '{print}' unique.ID_all.unique.GOs2
但我得到的是
TRINITY_DN23871_c0_g1_i1
GO:0003735
GO:0005783
GO:0005829
TRINITY_DN6318_c1_g1_i1
GO:0004707
GO:0005524
我没主意了。有人可以帮忙吗?
答案1
您可以从 2 循环到字段数 ( NF
) 并打印第一个字段和另一个字段,并用制表符分隔:
awk '{ for (i=2;i<=NF;i++) print $1"\t"$i }' unique.ID_all.unique.GOs2
答案2
使用米勒(https://github.com/johnkerl/miller), 从...开始
TRINITY_DN23871_c0_g1_i1 GO:0003735 GO:0005783 GO:0005829
TRINITY_DN6318_c1_g1_i1 GO:0004707 GO:0005524
和跑步
mlr --nidx --fs tab then reshape -r "^[^1]" -o item,value then cut -x -f item input.tsv >output.tsv
你将会拥有
TRINITY_DN23871_c0_g1_i1 GO:0003735
TRINITY_DN23871_c0_g1_i1 GO:0005783
TRINITY_DN23871_c0_g1_i1 GO:0005829
TRINITY_DN23871_c0_g1_i1
TRINITY_DN6318_c1_g1_i1 GO:0004707
TRINITY_DN6318_c1_g1_i1 GO:0005524
关于该命令的一些注意事项:
--nidx --fs tab
,设置输入输出格式reshape -r "^[^1]" -o item,value
,将输入文件从宽格式转换为长格式cut -x -f item
选择输出列