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