내 파일에는 data_0부터 data_4까지 반복되는 행의 데이터가 포함되어 있습니다. 존중되는 데이터세트 아래의 열 값으로 변환해야 합니다. 이전 카테고리의 데이터가 누락된 경우 공백/null 값을 입력할 수 있는 방법이 있습니까? 예를 들어
TimeStamp,Block,No_of_requests
04:19:12,data_0,4
04:19:12,data_1,6
04:19:12,date_2,8
04:19:12,date_3,10
04:19:12,data_4,12
04:19:14,data_0,5
04:19:14,data_1,6
04:19:14,date_3,7
04:19:14,data_4,8
예상 출력은 다음과 같습니다.
TimeStamp,data_0,data_1,data_2,data_3,data_4
04:19:12,4,6,8,10,12
04:19:14,5,6,,7,8
등. 해당 data_x 값을 사용할 수 없는 경우 빈 데이터를 배치해야 합니다.
답변1
암소 비슷한 일종의 영양awk
해결책:
awk 'BEGIN{
FS = OFS = ",";
PROCINFO["sorted_in"] = "@ind_num_asc";
print "TimeStamp,data_0,data_1,data_2,data_3,data_4"
}
NR > 1{ a[$1][substr($2, 6) + 1] = $3 }
END{
for (i in a) {
printf "%s,", i;
for (j=0; j<=4; j++) printf "%s%s", a[i][j+1], (j == 4? ORS:OFS)
}
}' file
산출:
TimeStamp,data_0,data_1,data_2,data_3,data_4
04:19:12,4,6,8,10,12
04:19:14,5,6,,7,8
답변2
Roman의 답변과 유사하지만 파일 내용의 하드 코딩이 적습니다.
awk -F, -v OFS=, '
NR > 1 {data[$1][$2] = $3; blocks[$2]}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
# header
printf "TimeStamp"
for (block in blocks) {
printf "%s%s", OFS, block
}
print ""
# data
for (ts in data) {
printf "%s", ts
for (block in blocks) {
printf "%s%s", OFS, data[ts][block]
}
print ""
}
}
' file
TimeStamp,data_0,data_1,data_4,date_2,date_3
04:19:12,4,6,12,8,10
04:19:14,5,6,8,,7
샘플 데이터에서는 "데이터" 그리고"날짜"둘 다.