Awk
連接同一 csv 文件的列以創建具有新標題的新列
我所擁有的是一個 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