将 TSV 中的列拆分为 CSV

将 TSV 中的列拆分为 CSV

我有一个包含两列的 TSV 文件,格式为

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

我想将第二列与第一列结合起来进行输出

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

有两个问题:

  • TSV第二列中逗号分隔值的数量不固定
  • 文件太大,无法加载到内存中

逗号分隔符值很干净,没有任何,.因此不"使用封闭。因此,我们在每个逗号处进行拆分。

答案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

上面假设您的第一列不能包含,s ,第二列不能包含制表符,从示例和问题中有关数据格式的陈述来看,这两者似乎都是正确的,因此它应该适用于您的数据。

答案2

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

这使用磨坊主( mlr) 读取由制表符分隔的无标头字段组成的记录并写入无标头 CSV。

对于每条记录(行),nest的操作mlr通过 options 进行评估--evar , -f 2,这意味着“将字段 2 中以逗号分隔的子字段(“嵌套字段”)分解为新记录”。

答案3

您可以将awkwithsplit函数用于第二个令牌:

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

相关内容