これは私の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
- フィールド番号に基づいて分解します。サム