Преобразование строк в столбцы в скрипте оболочки bash

Преобразование строк в столбцы в скрипте оболочки bash

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

Связанный контент