組合單獨的 csv 文件的腳本
我有兩個單獨的文件,其中包含我想合併為一個的客戶資訊。第一個文件包含全域資訊,第二個是選項。
基本上,每個客戶端在第一個文件中都有一個條目,而只有一些客戶端在第二個文件中有一個條目。
我的目標是將第二個文件合併到第一個(完整的)文件中,(如果可能的話)沒有重複的列。我試過粘貼和貓,但沒有成功……
例子 :
完整的.csv:
Number Name Surname Price Town 2 Alpha Beta 10.0 Blob 1 Gamma Delta 13.0 Upsy
選項.csv:
Number Name Surname Op_Price Option 1 Alpha Beta 65.0 Yawn
我想得到這樣的東西:
結果.csv:
Number Name Surname Price Town Op_Price Option 2 Alpha Beta 10.0 Blob 65.0 Yawn 1 Gamma Delta 13.0 Upsy
你能給我指個方向嗎?
乾杯
您可以使用並結合其他工具來實現這一點
join
,這些工具都是 coreutils 的一部分,因此存在於每個 Linux 機器上。BSD 也有這些工具,但它們沒有我在這裡使用的標誌。
join
使用其中一列作為比較兩個文件中的行的鍵。要將多列用作鍵,您必須從中刪除空格,例如用製表符替換它們。您沒有指定這是否是您想要的,所以我假設我們正在加入“名稱”。如果您需要合併列,請提出一個單獨的問題。最後一個先決條件:兩個文件都需要在鍵列上進行排序。您的範例數據似乎已經按“名稱”排序,但讓我們確保:
$ sort --key=2 complete.csv > sorted-complete.csv $ sort --key=2 options.csv > sorted-options.csv
現在我們準備將文件粘貼在一起:
$ join -a 1 -j 2 -o '1.1 1.2 1.3 1.4 1.5 2.4 2.5' \ --header sorted-complete.csv sorted-options.csv \ | column -t Number Name Surname Price Town Op_Price Option 2 Alpha Beta 10.0 Blob 65.0 Yawn 1 Gamma Delta 13.0 Upsy
讓我們解構它。
為了便於閱讀,反斜杠 (
\
) 用於換行。您可以刪除它們。
-a 1
表示“列印第一個文件中的所有行” (即 sorted-complete.csv)。
-j 2
意思是“關鍵列是第二個”。
-o ...
設置輸出格式。它包含格式為<file number>.<column number
. 例如,“1.1”表示“sorted-complete.csv”的第一列,而 2.5 表示“sorted-options.csv”的第五列。如果不指定輸出格式,鍵列會先列印出來,在“完整”數據之後重複。最後,
column -t
將輸出重新格式化為對齊良好的表格。沒有這個,列將是鋸齒狀的,因為它們都將被一個空格分隔。