我遇到了一个特殊的要求,需要将动态行数据转换为列字段。假设我有一个文件“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