带行条件转置

带行条件转置

在 unix 中格式化以下测试数据时需要帮助。

样本数据:

Dan serv1 p1
Dan serv2 p2
Dan serv3 p3 
Dus serv2 p1
Dus serv3 p2
Dus Serv5 p3 
Tes serv3 p1
Tes serv5 p3

需要的格式:

Name p1    p2    p3
Dan serv1 serv2 serv3
Dus serv2 serv3 serv5
TEs serv3       Serv5

答案1

mlr --n2p \
    label Name,Server,Prio then \
    reshape -s Prio,Server then \
    unsparsify  file

输出:

Name p1    p2    p3
Dan  serv1 serv2 serv3
Dus  serv2 serv3 Serv5
Tes  serv3 -     serv5

这使用磨坊主( mlr) 首先将输入中的三个字段按此顺序标记为NameServer、 和Prio(我不知道这些标签是否有意义,但它们比字段编号更容易使用)。标记后,数据将被重新整形以获得每个的新记录Name。每条新记录都有一个Name字段,后接多个Prio字段。每个字段的值Prio就是Server值。

最后的unsparsify操作为缺少某些字段值的记录创建空字段(这会添加-您在输出中看到的 )。

该选项是(索引输入字段)后跟(漂亮打印的输出)的--n2p简写。您还可以尝试获取制表符分隔的输出,或获取 CSV。--inidx--opprint--n2t--n2c

答案2

awk

awk '{ id=substr($NF,2); nf=nf<id?id:nf; serv[$1, id]= $2 }
END  { for (x in serv){
           split(x, tmp, SUBSEP)
           if(x in serv){
               printf ("%s", tmp[1])
               for (i=1; i<=nf; i++){
                   printf ("%s", OFS "[" serv[tmp[1], i] "]")
                   delete serv[tmp[1], i]
               }
               print ""
           }
       }
}' infile

输出:

Dan [serv1] [serv2] [serv3]
Dus [serv2] [serv3] [Serv5]
Tes [serv3] [] [serv5]

相关内容