У меня есть некоторые выходные данные в виде:
count id type
588 10 | 3
10 12 | 3
883 14 | 3
98 17 | 3
17 18 | 1
77598 18 | 3
10000 21 | 3
17892 2 | 3
20000 23 | 3
63 27 | 3
6 3 | 3
2446 35 | 3
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
1000 5 | 3
...
Который довольно грязный и должен быть очищен до CSV, так что я могу подарить его менеджеру проекта для него, черт возьми, из таблицы.
Суть проблемы заключается в следующем: мне нужно, чтобы это было:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Примером этого является id "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Это должно быть вместо:
4,15,253,19871
К сожалению, я такой мусор в таких вещах, мне удалось очистить все строки в CSV, но я не смог дедуплицировать и сгруппировать строки. Прямо сейчас у меня есть это:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Но все, что нужно, это очистить мусорные символы и снова напечатать строки.
Каков наилучший способ массирования строк в вышеупомянутый вывод?
shell-script
text-processing
awk
sed
csv
Павел
источник
источник
Ответы:
Способ сделать это - поместить все в хеш.
редактировать: мой первый ответ не ответил на вопрос должным образом
источник
NF<4{$4="no_type";}
в началеPerl на помощь:
Он хранит две таблицы, таблицу типов и таблицу идентификаторов. Для каждого идентификатора хранится сумма для каждого типа.
источник
Если GNU datamash является вариантом для вас, то
источник
Python (и
pandas
библиотека, в частности, очень подходит для такой работыЭто читает данные CSV в
pandas DataFrame
Затем мы группируем эти данные
id
и берем сумму столбцаcount
unstack
Перестраивает это , чтобы переместить идентификаторы к колоннам, иfillna
заполняет пустые поля с 0 'Это возвращает
Поскольку информационный фрейм содержит отсутствующие данные (пустые комбинации типа id), pandas преобразует
int
s вfloat
(ограничение внутренних обработок). Если вы знаете, что входные данные будут только int, вы можете изменить следующую или последнюю строку наdf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
источник
Вы можете использовать Perl для циклического перемещения по CSV-файлу и накапливания суммы соответствующих типов в хэше, находясь в пути. И, наконец, отобразить информацию, собранную для каждого идентификатора.
Структура данных
Это помогает понять код ниже:
Perl
Выход
источник
мой дубль, не слишком отличающийся от других. Использует GNU awk, который имеет массивы массивов
выходы
источник
Вы можете использовать этот код для суммирования значений на основе вашего столбца id,
Я добавил один оператор awk после вашего кода
Вперед с этим ...
источник