将表中的行转换为列

将表中的行转换为列

这是我的 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

相关内容