将动态行数据透视到另一列中唯一值的列

将动态行数据透视到另一列中唯一值的列

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

相关内容