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
작업은 일부 필드 값이 누락된 레코드에 대해 빈 필드를 생성합니다(이렇게 하면 -
출력에 표시되는 내용이 추가됩니다).
이 옵션은 (index input field) 다음에 (pretty-printed out) 이 오는 약어입니다 --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]