使用可变数量的字符串拆分特定列的内容

使用可变数量的字符串拆分特定列的内容

我需要在新行中打印第二列中的每个“单词”,并在每个新行中复制第一列中的文本。各列以制表符分隔,第二列中的所有“单词”均以“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选择输出列

相关内容