テーブルの行を列に変換

テーブルの行を列に変換

これは私の1.fileです(区切り記号は「\ t」です)。

 ot1     a       a,b,c,d,e
 ot2     b       b,c,q
 ot3     c       c,f,g
 ot4     e       a,g,e

2.fileをインポートしたい(区切り記号は「\ t」です)。

 ot1     a       a
 ot1     a       b
 ot1     a       c
 ot1     a       d
 ot1     a       e
 ot2     b       b
 ot2     b       c
 ot2     b       q
 ot3     c       c
 ot3     c       f
 ot3     c       g
 ot4     e       a
 ot4     e       g
 ot4     e       e

まず、"sed -i "s/,/\n/g"を試してみましたが、次に何をすべきかわかりません。助けてくれてありがとう。

答え1

次の操作が実行されます。

awk -F\\t 'BEGIN {OFS=FS} {n=split($3,aa,",");for (i=1;i<=n;i++) {$3=aa[i]; printf "%s\n" $0 }}' 

最初のタブ区切り文字にはダブルエスケープが必要です。

次に、3番目のタグを分割し、分割配列の要素数を取得します。

次に、ループの3番目のタグを分割要素に置き換えて印刷します。

答え2

ミラーはここで働きます:

mlr --tsv -N nest --explode --values --across-records --nested-fs "," -f 3 1.file > 2.file

説明する

--tsv- 入力と出力にタブ区切りの値ファイル形式を使用します。

-N- ヘッダ名の代わりに数値IDを使用してフィールドをアドレス指定する

nest- データが入れ子になっています。

--explode- ネストされたデータの分解

--values- 入れ子になったデータは別の値です。

--across-records- 分解されたデータを別のレコードに書き込む

--nested-fs- 入れ子になった値のフィールド区切り記号

-f 3- フィールド番号に基づいて分解します。サム

関連情報