行形式データを列形式に変換

行形式データを列形式に変換

次のデータセットがあります。

Name:      Jim Bean
Vice:      Dice
ID:        AFDSDFDSFDSFASFA
LoginTime: 12343314

Name:      Bob Dylon
Vice:      Trumpets
ID:        AFD232SFDSFASFA
LoginTime: 12343314

Name:      Mary Jane
Vice:      Gambling
ID:        EWDSFDSFASFA
LoginTime: 12343314

.....

列形式で整理する必要があります。私の最初の考えは.を使用することでしたが、awk少し詰まっていました。

ラベルは常に同じ順序で表示され、各グループには常に同じ数のラベル/値のペアが表示されます(タイトルは重要ではありません)。

私の質問は:どうすればいいですか?

このコマンドは同様のことができるというヒントを見たことがありますが、rsすべてのシステムで標準ではありません。

答え1

質問とともに必要な出力を投稿する必要があります。私の推測はこんな感じです。

$ awk '{ if($2) printf("%s ", $2); else print ""; }' < dataset
Jim Dice AFDSDFDSFDSFASFA 12343314 
Bob Trumpets AFD232SFDSFASFA 12343314 
Mary Gambling EWDSFDSFASFA 12343314

これは非常に愚かなアプローチなので、何も検証しません。入力した内容が投稿した内容と異なる場合、競合が発生する可能性があります。

答え2

RSとFSの使用に注意しながら、GNU awkを使用してこれを行うことができます。

<infile awk '{ print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

ヘッダーを保持するには:

<infile awk 'NR==1 { print $1, $3, $5, $7 } { print $2, $4, $6, $8 }' RS='\n\n' FS=': +|\n' OFS='\t'

すべてのレコードの形式が次のと仮定すると、coreutilsを使用して次のことができます。

<infile grep -v '^$' | tr -s ' ' | cut -d' ' -f2- | paste - - - -

出力:

Jim Bean    Dice    AFDSDFDSFDSFASFA    12343314
Bob Dylon   Trumpets    AFD232SFDSFASFA 12343314
Mary Jane   Gambling    EWDSFDSFASFA    12343314

タイトル付き出力:

Name    Vice    ID      LoginTime
Jim Bean        Dice    AFDSDFDSFDSFASFA        12343314
Bob Dylon       Trumpets        AFD232SFDSFASFA 12343314
Mary Jane       Gambling        EWDSFDSFASFA    12343314

関連情報