ソートされていないフィールドを持つ行操作

ソートされていないフィールドを持つ行操作

このデータセットがありますが、それを整理された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

おすすめ記事