행을 사용한 조건부 전치

행을 사용한 조건부 전치

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]

関連情報