У меня есть файл CSV на этот счет:

+------------+--------------+
| Category I | Sub-Category |
+------------+--------------+
|       1144 |          128 |
|       1144 |          128 |
|       1000 |          100 |
|       1001 |          100 |
|       1002 |          100 |
|       1002 |          100 |
|       1011 |          102 |
|       1011 |          102 |
|       1011 |          102 |
|       1011 |          102 |
|       1011 |          102 |
|       1011 |          102 |
|       1013 |          103 |
|       1013 |          103 |
|       1013 |          103 |
|       1013 |          103 |
|       1013 |          103 |
|       1013 |          103 |
|       1013 |          103 |
+------------+--------------+

Я хочу объединить первый и второй столбцы выше, чтобы сформировать третий, новый столбец с новым произвольным заголовком, для этого:

+-------------+--------------+-----------------------+
| Category ID | Sub-Category | Arbitrary New Heading |
+-------------+--------------+-----------------------+
|        1144 |          128 |               1144128 |
|        1144 |          128 |               1144128 |
|        1000 |          100 |               1000100 |
|        1001 |          100 |               1001100 |
|        1002 |          100 |               1002100 |
|        1002 |          100 |               1002100 |
|        1011 |          102 |               1011102 |
|        1011 |          102 |               1011102 |
|        1011 |          102 |               1011102 |
|        1011 |          102 |               1011102 |
|        1011 |          102 |               1011102 |
|        1011 |          102 |               1011102 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
|        1013 |          103 |               1013103 |
+-------------+--------------+-----------------------+

Моя обычная утилита для перехода, csvkit не имеет средств для достижения этого, на самом деле - см. https: //github.com/wireservice/csvkit/issues/930.

Какое простое решение, не требующее продвинутых знаний в области программирования, может достичь этого?

Я смутно знаю awk и sed как потенциальные решения, но я не хочу ограничивать запрос только ими на тот случай, если есть лучшее (то есть более простое) решение.

Решение должно быть эффективным для очень больших файлов, то есть содержащих более 120 000 строк.

Изменить: я включил образцы данных для удобства тех, кто хочет попробовать их; скачать здесь: https://www.dropbox.com /s/achtyxg7qi1629k/category-subcat-test.csv?dl=0

0
ptrcao 25 Дек 2019 в 09:24
1
(1) Пожалуйста, разместите образец данных (в виде текста) в своем вопросе. (2) Если ваш входной файл в формате CSV, покажите его как таковой. (3) Если вы хотите вывести CSV, скажите об этом (в вопросе, в предложении на английском языке) и покажите это как таковое. (4) Укажите (в предложении на английском языке), как вы хотите обрабатывать первую строку (т. е. заголовки).
 – 
G-Man Says 'Reinstate Monica'
25 Дек 2019 в 07:24
Спасибо за ваш отзыв. (1) Я уже связал весь текстовый файл выше, (2) Я упомянул CSV во многих местах, расширение файла — CSV, тег вопроса — CSV, CSV — в заголовке. (3) Я полагаю, что мог бы явно указать вывод csv, но экономная интерпретация заключается в том, что, поскольку я не просил изменений в файле, нет причин думать, что это то, что я хотел (4) в исходном посте, я упомянул «a третий третий, новый столбец с новым произвольным заголовком». Я не идеален, и с кем угодно есть возможности для совершенствования, но я чувствовал, что в целом это ясно на трибунах.
 – 
ptrcao
25 Дек 2019 в 08:51
@ G-Man говорит: «Восстановите Монику». Сейчас я преобразовал изображения в текст — пожалуйста, отмените отрицательный голос.
 – 
ptrcao
25 Дек 2019 в 09:28

2 ответа

Лучший ответ

Используя Miller (https://github.com/johnkerl/miller) и этот пример входного файла

Category ID,Sub-Category
1001,128
1002,127
1002,126
1004,122

И бег

mlr --csv put -S '$fieldName=${Category ID}." ".${Sub-Category}' input.csv >output.csv

У тебя будет

+-------------+--------------+-----------+
| Category ID | Sub-Category | fieldName |
+-------------+--------------+-----------+
| 1001        | 128          | 1001 128  |
| 1002        | 127          | 1002 127  |
| 1002        | 126          | 1002 126  |
| 1004        | 122          | 1004 122  |
+-------------+--------------+-----------+

И вы можете запустить также csvsql, он работает таким образом

csvsql -I --query 'select *,("Category ID" || " " || "Sub-Category") fieldname from input' input.csv >output.csv
5
aborruso 21 Дек 2019 в 14:23
С вашим решением csvsql я получил: [root@server test]# csvsql -I --query 'выбрать *, ("Идентификатор категории" || " " || "Подкатегория") имя поля из ввода' category-subcat-test.csv > output.csv (sqlite3.OperationalError) нет такой таблицы: input [SQL: выберите *, ("Идентификатор категории" || " " || "Подкатегория") имя поля из ввода] (Фон об этой ошибке по адресу: sqlalche.me/e/e3q8)
 – 
ptrcao
21 Дек 2019 в 14:41
Переименуйте, пожалуйста, category-subcat-test.csv в input.csv и повторите проверку. Если это работает, вы должны изменить запрос, потому что вы должны вставить свое имя файла в запрос. Меня зовут input.csv
 – 
aborruso
21 Дек 2019 в 14:43
У меня было так: csvsql -I --query 'select *,("Category ID" || " " || "Sub-Category") fieldname from input' category-subcat-test.csv >output.csv
 – 
ptrcao
21 Дек 2019 в 14:46
2
Хорошо, вы должны изменить команду в csvsql -I --query 'select *,("Category ID" || " " || "Sub-Category") fieldname from "category-subcat-test"' category-subcat-test.csv >output.csv
 – 
aborruso
21 Дек 2019 в 14:48
1
Спасибо, это сработало :)
 – 
ptrcao
21 Дек 2019 в 14:53

Команда

Tried with below command

awk 'NR>1{print $1,$2,$1$2 }' file| sed '1i Category Sub-Category New Heading'

Выход

Category Sub-Category New Heading
1144 128 1144128
1144 128 1144128
1000 100 1000100
1001 100 1001100
1002 100 1002100
1002 100 1002100
1011 102 1011102
1011 102 1011102
1011 102 1011102
1011 102 1011102
1011 102 1011102
1011 102 1011102
1013 103 1013103
1013 103 1013103
1013 103 1013103
1013 103 1013103
1013 103 1013103
1013 103 1013103
0
Praveen Kumar BS 22 Дек 2019 в 10:28
3
Не могли бы вы вывести его в файл csv и подтвердить, что все столбцы правильно разделены? Мы должны видеть, что заголовки также правильно выравниваются со столбцами данных.
 – 
ptrcao
22 Дек 2019 в 12:16