我有一个 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
答案1
使用米勒(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
答案2
命令
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