Shell-Script

組合單獨的 csv 文件的腳本

  • June 12, 2019

我有兩個單獨的文件,其中包含我想合併為一個的客戶資訊。第一個文件包含全域資訊,第二個是選項。

基本上,每個客戶端在第一個文件中都有一個條目,而只有一些客戶端在第二個文件中有一個條目。

我的目標是將第二個文件合併到第一個(完整的)文件中,(如果可能的話)沒有重複的列。我試過粘貼和貓,但沒有成功……

例子 :

完整的.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將輸出重新格式化為對齊良好的表格。沒有這個,列將是鋸齒狀的,因為它們都將被一個空格分隔。

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