動的行データを列フィールドに変換する特別な要件が見つかりました。次の内容を含む「output.csv」ファイルがあるとします。
TimeStamp,Block,No_of_requests
04:19:12,Block_1,4
04:19:12,Block_2,4
04:19:14,Block_1,3
04:19:15,Block_1,1
04:19:15,Block_2,2
04:19:16,Block_1,5
04:19:16,Block_2,1
必要な出力は次のとおりです。
TimeStamp,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1
output.csvファイルはスクリプトを使用して動的に生成されるため、ブロック数に制限はありません(ここにはBlock_1とBlock_2がありますが、スクリプトはBlock_3、Block_4、Block_5などのようなより多くのブロックを生成できます)。
要求数と各ブロックの下の一意のタイムスタンプ値を持つ列ヘッダーとしてブロック番号が必要です。
私はしばらくこれについて心配してきましたが、まだこのピボットポイントを作成する方法がわかりません。
答え1
awk
入力データがソートされたと仮定してスクリプトを作成します。
awk -F',' 'NR>1 {a[$1]=a[$1]","$3}
END{ print "Timestamp, Block_1, Block_2";
for (i in a) print i""a[i]}' infile
それ以外の場合は、最初に並べ替えてから上に渡してくださいawk
。
awk -F',' 'NR>1 {a[$1]=a[$1]","$3}
END{ print "Timestamp, Block_1, Block_2";
for (i in a) print i""a[i]}' <(sort infile)
答え2
GNUデータの混合次の場所に非常に近づくことができます:
$ datamash -st, --header-in --filler='' crosstab 1,2 unique 3 < output.csv
,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1
TimeStamp
ヘッダーを再挿入するには、次のようにパイプしますsed
。
$ datamash -st, --header-in --filler='' crosstab 1,2 unique 3 < output.csv |
sed '1s/^/Timestamp/'
Timestamp,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1