TSVからCSVへの熱分割

TSVからCSVへの熱分割

次の形式の2つの列を持つTSVファイルがあります。

id1\tcol1,col2,col3
id2\tcol4,col5

2列目を1列目と組み合わせて出力したいです。

id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

2つの質問があります。

  • TSVの2番目の列にカンマで区切られた値の固定されていない数
  • ファイルが大きすぎてメモリにロードできません。

カンマで区切られた値はきれいでなく、囲みを使用しません,"だから私たちはカンマごとに分けました。

答え1

awkを使用してください。

$ awk -F'[\t,]' -v OFS=',' '{for (i=2; i<=NF; i++) print $1, $i}' file
id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

上記は、最初の列に,を含めることはできず、2番目の列にはタブを含めることができないとします。どちらもデータ型に関する質問の例と説明で正しいように見えるため、データに適している必要があります。

答え2

$ mlr --t2c -N nest --evar , -f 2 file
id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

これは以下を使用します。ミラーmlr)は、タブ区切りのヘッダーレスフィールドで構成されたレコードを読み取り、ヘッダーレスCSVを作成します。

各レコード(行)に対して、ジョブはnestoptionsmlrによって評価されます--evar , -f 2。これは、「フィールド2のカンマ区切りのサブフィールド(「ネストしたフィールド」)を新しいレコードに分解する」を意味します。

答え3

2番目のトークンにawkwith関数を使用できます。split

awk  'BEGIN {OFS=","} {n=split($2,a,",");  for(i=1;i<=n;i++) print $1,a[i]} ' input_file

答え4

Pythonを使用したい場合、これは非常に簡単に見えます。

#!/usr/bin/env python

from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
    for line in f:
        key, vals = line.strip().split('\t')
        for val in vals.split(','):
            print(key, val, sep=',')

このfrom __future__行はPython2と3で動作していることを確認します。

関連情報