名前は「|文字」で区切られたペアで区切られます。

名前は「|文字」で区切られたペアで区切られます。

同じ行にある名前を別々のペアに分割したいと思います。

TMPRSS2|pp9284 AADAT Sample1
ERG    TMPRSS2|pp9284 Sample2
TMPRSS2|pp9284 ETV1 Sample3
PDE4A   MIA|MIA-RAB4B|RAB4B|RAB4B-EGLN2|EGLN2 Sample4

これはおそらく

TMPRSS2 AADAT Sample1
pp9284 AADAT Sample1
ERG    TMPRSS2 Sample2
ERG  pp9284 Sample2
TMPRSS2 ETV1 Sample3
pp9284 ETV1 Sample3
PDE4A MIA Sample4
PDE4A MIA-RAB4B Sample4
PDE4A RAB4B Sample4
PDE4A RAB4B-EGLN2 Sample4
PDE4A EGLN2 Sample4

両方の列に複数の名前があるため、別々のペアが必要です。別のペアがある後に他のテーブルと比較したいので、このためにmysqlを使ってみました。 Rのstrsplitは、複数の名前の数が固定されている場合にのみ機能します。しかし、行ごとに異なります。 sed、awkを使用してこれを実行できますか?

値が同じままである特定の列もあり、デフォルトでは同じ行内の値は同じままです。この列をどのように印刷する必要がありますか? 3番目の列を追加しましたが、その値が新しい行にコピーされました。これを行うには、forループでprint $ 3を使用して印刷しましたが、うまくいきません。

ベストアンサー1

$ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j];}}' file
TMPRSS2 AADAT
pp9284 AADAT
ERG TMPRSS2
ERG pp9284
TMPRSS2 ETV1
pp9284 ETV1
PDE4A RAB4B-EGLN2
PDE4A EGLN2
PDE4A MIA
PDE4A MIA-RAB4B
PDE4A RAB4B

3番目の(SampleN)フィールドを同時に印刷するには、$3ループ内に印刷ステートメントを追加するだけです。

$ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j],$3;}}' file
TMPRSS2 AADAT Sample1
pp9284 AADAT Sample1
ERG TMPRSS2 Sample2
ERG pp9284 Sample2
TMPRSS2 ETV1 Sample3
pp9284 ETV1 Sample3
PDE4A RAB4B-EGLN2 Sample4
PDE4A EGLN2 Sample4
PDE4A MIA Sample4
PDE4A MIA-RAB4B Sample4
PDE4A RAB4B Sample4

おすすめ記事