使用第一列作为unix shell中的引用将行转置为列

问题描述 投票:0回答:1

我正在尝试转换这些数据:

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

bash unix awk
1个回答
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中的所有数组元素运行一个循环,并打印索引以及新数组中的元素。
© www.soinside.com 2019 - 2024. All rights reserved.