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