我有如下数据文件:

chr1 762440 762981 SAMD11
chr1 858932 859148 KLHL17 SAMD11 NOC2L
chr1 859786 860145 KLHL17 SAMD11 NOC2L
chr1 890663 891747 KLHL17 NOC2L  SAMD11  HES4

我想用前三列中的值把所有的名字排在另一个下面。
像这样的东西
chr1 762440 762981 SAMD11
chr1 858932 859148 KLHL17
chr1 858932 859148 SAMD11
chr1 858932 859148 NOC2L
chr1 859786 860145 KLHL17
chr1 859786 860145 SAMD11
chr1 859786 860145 NOC2L

此输出用于前三行,但对于整个集合是必需的。
每一行的名字数目不是固定的,请记住这一点(可以是1个或5个,也可以是10个或20个名字)
What I thought

使用sed-i.bak将名称与前三列中的值放在一起。
但最终变得过于复杂。
你能想出一个更简单的方法来解决这个问题吗?
谢谢你

最佳答案

使用awk

awk '{for (i=4;i<=NF;i++) print $1,$2,$3,$i}' file
chr1 762440 762981 SAMD11
chr1 858932 859148 KLHL17
chr1 858932 859148 SAMD11
chr1 858932 859148 NOC2L
chr1 859786 860145 KLHL17
chr1 859786 860145 SAMD11
chr1 859786 860145 NOC2L
chr1 890663 891747 KLHL17
chr1 890663 891747 NOC2L
chr1 890663 891747 SAMD11
chr1 890663 891747 HES4

09-27 23:32