Awk

連接同一 csv 文件的列以創建具有新標題的新列

  • December 25, 2019

我所擁有的是一個 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 沒有辦法實現這一點,afaik - 請參閱https://github.com/wireservice/csvkit/issues/930

什麼是不需要高級程式知識的簡單解決方案,可以實現這一點?

我模糊地意識到 awk 和 sed 是潛在的解決方案,但我不想將查詢限制在那些以防萬一有更好(即更簡單)的解決方案的情況下。

該解決方案必須對非常大的文件有效,即包含 120,000+ 行。

編輯:為了方便那些想要破解它的人,我已經包含了範例數據;在這裡下載:https ://www.dropbox.com/s/achtyxg7qi1629k/category-subcat-test.csv?dl=0

使用 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

引用自:https://unix.stackexchange.com/questions/558347