连接同一 csv 文件的列以创建具有新标题的新列

ptr*_*cao 0 sed awk csv csvkit

我有一个 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 |
+------------+--------------+
Run Code Online (Sandbox Code Playgroud)

我希望将上面的第一列和第二列连接起来,以形成具有新的任意标题的第三列新列,以达到以下效果:

+-------------+--------------+-----------------------+
| 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 |
+-------------+--------------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

我通常的首选实用程序 csvkit 没有办法实现这一点,afaik - 请参阅https://github.com/wireservice/csvkit/issues/930

什么是不需要高级编程知识的简单解决方案,可以实现这一目标?

我隐约知道 awk 和 sed 是潜在的解决方案,但我不想将查询限制在那些有更好(即更简单)解决方案的情况下。

该解决方案必须对非常大的文件有效,即包含 120,000 多行。

编辑:为了方便那些想要破解它的人,我已经包含了示例数据;在这里下载:https : //www.dropbox.com/s/achtyxg7qi1629k/category-subcat-test.csv?dl=0

abo*_*uso 5

使用 Miller ( https://github.com/johnkerl/miller ) 和这个示例输入文件

Category ID,Sub-Category
1001,128
1002,127
1002,126
1004,122
Run Code Online (Sandbox Code Playgroud)

和跑步

mlr --csv put -S '$fieldName=${Category ID}." ".${Sub-Category}' input.csv >output.csv
Run Code Online (Sandbox Code Playgroud)

你将会有

+-------------+--------------+-----------+
| Category ID | Sub-Category | fieldName |
+-------------+--------------+-----------+
| 1001        | 128          | 1001 128  |
| 1002        | 127          | 1002 127  |
| 1002        | 126          | 1002 126  |
| 1004        | 122          | 1004 122  |
+-------------+--------------+-----------+
Run Code Online (Sandbox Code Playgroud)

你也可以运行 csvsql,它以这种方式工作

csvsql -I --query 'select *,("Category ID" || " " || "Sub-Category") fieldname from input' input.csv >output.csv
Run Code Online (Sandbox Code Playgroud)

  • 好的,您必须更改 `csvsql -I --query 'select *,("Category ID" || " " || "Sub-Category") fieldname from "category-subcat-test"' category-subcat- 中的命令test.csv > output.csv` (2认同)