这是我的 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 }}'
第一个制表分隔符需要双重转义
然后分割第三个标记并获取分割数组中的元素数量
然后用分割元素替换循环中的第三个标记并打印
答案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
- 根据字段号爆炸。 3