동적 행 데이터를 다른 열에 고유한 값이 있는 열로 피벗

동적 행 데이터를 다른 열에 고유한 값이 있는 열로 피벗

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

관련 정보