在 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
) 首先将输入中的三个字段按此顺序标记为Name
、Server
、 和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]