可変数の文字列を使用して特定の列の内容を分割する

可変数の文字列を使用して特定の列の内容を分割する

新しい行の2番目の列の各「単語」を印刷し、各新しい行の最初の列のテキストをコピーする必要があります。列はタブで区切られ、2番目の列のすべての「単語」は「GO:」で始まり、スペースで区切られます。また、各行には1から数十までのさまざまな「単語」数があります。

例えば

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出力列の選択

関連情報