다음 입력을 원하는 출력으로 변환하는 스크립트를 작성해야 합니다. 입력은 csv 파일입니다.
입력 샘플
Id, sid,value,name
20,2,245,f1
20,2,345,f2
20,3,445,f3
샘플 출력
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
각 행의 세 번째와 네 번째 열을 열로 변환해야 합니다.
예를 들어 첫 번째 행과 두 번째 행의 첫 번째 열과 두 번째 열이 동일하므로 f1과 f2의 값은 각 행의 세 번째 열이 되어야 하고 f3은 비어 있어야 합니다.
답변1
당신이 csvsql
사용할 수있는csvkit.
csvsql -S --query '
select
"Id",
sid,
max(case when name="f1" then value else null end) as f1,
max(case when name="f2" then value else null end) as f2,
max(case when name="f3" then value else null end) as f3
from file
group by "Id",sid
' file
- 열은
" sid"
선행 공백으로 호출되므로-S
(초기 공백 건너뛰기) --- 또는" sid"
쿼리에 사용해야 합니다. max()
동일한 ID/SID 쌍이 여러 개 발견되어야 하는 경우 사용할 값을 결정하는 데 사용했습니다.avg()
또는 등을 사용하고 싶을 수도 있습니다min()
(예를 보려면 @FedonKadifeli의 설명 참조).
산출:
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
답변2
밀러 사용(https://github.com/johnkerl/miller)
mlr --csv reshape -s name,value then unsparsify input.csv
당신은 할 것
Id, sid,f1,f2,f3
20,2,245,345,
20,3,,,445