我试图转换这些数据:
EU842263.1.1492 AA.A_1 BB.B_2 CC.C_3
LN612956.1.1401 AA.A_1 BB.B_2 CC.C_3 DD.D_4 EE.E_5 FF.F_6
GU304497.1.1513 AA.A_1
AB905872.1.1334 AA.A_1 BB.B_2 CC.C_3 DD.D_4
进入这个:
EU842263.1.1492 AA.A_1
EU842263.1.1492 BB.B_2
EU842263.1.1492 CC.C_3
LN612956.1.1401 AA.A_1
LN612956.1.1401 BB.B_2
LN612956.1.1401 CC.C_3
LN612956.1.1401 DD.D_4
LN612956.1.1401 EE.E_5
LN612956.1.1401 FF.F_6
GU304497.1.1513 AA.A_1
AB905872.1.1334 AA.A_1
AB905872.1.1334 BB.B_2
AB905872.1.1334 CC.C_3
AB905872.1.1334 DD.D_4
我怎样才能做到这一点?
请注意,数据(AA.A_1)仅代表我的实际数据(例如,0.15.01610.011_528399)。
答案 0 :(得分:1)
您可以在Awk
中执行此操作,获取第一列中值的哈希映射作为键,将行的其余部分中的值作为哈希值。
awk '
{
for(i=2;i<=NF;i++)
unique[$1]=(unique[$1]FS$i); next
} END {
for (i in unique) {
n=split(unique[i],temp);
for(j=1;j<=n;j++)
print i,temp[j]
}
}' file
应该适用于任何符合POSIX标准的shell上的awk
。
步骤: -
for(i=2;i<=NF;i++)
针对第2列运行,直到每行中的最后一列,并根据第一列(unique
)和其他列的值创建哈希映射$1
从$2
到$NF
END
下的部分会运行。我们使用split()
调用将每个值与数组分开,并将它们存储为数组temp
中的单个元素。temp
中的所有数组元素运行一个循环,并将索引与新数组中的元素一起打印。