使用第一列将行转换为列作为unix shell

时间:2017-12-21 11:04:36

标签: bash unix awk

我试图转换这些数据:

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)。

1 个答案:

答案 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中的所有数组元素运行一个循环,并将索引与新数组中的元素一起打印。