
次のデータセットがあります。
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