동적 행 데이터를 열 필드로 변환해야 하는 특별한 요구 사항을 발견했습니다. 다음 내용이 포함된 "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