我有一个包含两列的 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
您可以将awk
withsplit
函数用于第二个令牌:
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