Перенос данных динамической строки в столбцы по уникальным значениям в другом столбце

Я застрял с определенным требованием, которое требует преобразования данных динамической строки в поля столбца. Предположим, у меня есть файл 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 и т. д.)

Мне нужны номера блоков в качестве заголовков столбцов и количество запросов в каждом блоке по уникальным значениям TimeStamp.

Я долго ломал голову над этим, но до сих пор не могу понять, как создать эту опору.

0
19.09.2017, 04:46
2 ответа

Просто 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

else сначала отсортируйте его, а затем передайте выше 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) 
0
28.01.2020, 04:39

Массив данных 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
0
28.01.2020, 04:39

Теги

Похожие вопросы