정렬되지 않은 필드가 있는 행 조작

정렬되지 않은 필드가 있는 행 조작

이 데이터세트가 있지만 이를 정리된 Csv 데이터 파일로 변환하고 싶습니다. 문제는 OBI를 나타내는 문자열이 다음 줄의 동일한 필드에 항상 있지는 않다는 것입니다.

NAM: 0,CDC: 0,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1
NAM: 0,CDC: 4,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OSB1: 1
NAM: 0,CDC: 1,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1,OSB1: 1
NAM: 0,CDC: 0,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OBI: 1,OSB1: 1
NAM: 0,CDC: 422,SUBSPDPCPVERS: 4,CAMP: 0,serv: CSPS,CSLOC: 2,PSLOC: 2,GSMUEFEAT: 0,UNKNLOCDATECS:: EAoL,UNKNLOCDATEPS:: EAoL,OSB1: 1

이 출력을 얻고 싶습니다. rs를 사용하여 해당 필드의 행을 찾고 필드별로 반환한 다음 파일을 결합하려고 시도했지만 작동하지 않습니다.

NAM,CDC,SUBSPDPCPVERS,CAMP,serv,CSLOC,PSLOC,GSMUEFEAT,UNKNLOCDATECS,UNKNLOCDATEPS,OBI,OSB1
0,0,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,
0,4,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,,1
0,1,,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,1
0,0,,:0,CSPS,2,2,:0,:EAoL,:EAoL,1,1
0,422,4,:0,CSPS,2,2,:0,:EAoL,:EAoL,,1

답변1

perl -nlE 'if($.==1){                            # if first line 
              @L = /(\w+):/g ;                   # L = list of keys
              say join(",",@L)}                  # print header 
           ($a,%b)=split(/\s*,?(\w+):/,$_,-1);   # b: dict of (keys, values)  
           say join(",", map { $b{$_} } @L)'  ex.txt

관련 정보