次の形式の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を作成します。
各レコード(行)に対して、ジョブはnest
optionsmlr
によって評価されます--evar , -f 2
。これは、「フィールド2のカンマ区切りのサブフィールド(「ネストしたフィールド」)を新しいレコードに分解する」を意味します。
答え3
2番目のトークンにawk
with関数を使用できます。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で動作していることを確認します。