別々のcsvファイルを結合するスクリプト

別々のcsvファイルを結合するスクリプト

1つにマージしたい顧客情報を含む2つの別々のファイルがあります。最初のファイルにはグローバル情報が含まれ、2番目のファイルはオプション用です。

デフォルトでは、すべてのクライアントは最初のファイルにエントリを持ち、一部のクライアントだけが2番目のファイルにエントリを持ちます。

私の目標は、(可能であれば)重複列なしで2番目のファイルを最初の(完全な)ファイルにマージすることです。ペーストと猫を試してみましたが、成功しませんでした...

例:

完了.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

私に方向を教えてもらえますか?

乾杯

答え1

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」の5番目の列を表します。出力形式を指定しないと、キー列が最初に印刷され、「すべて」データの後に繰り返されます。

最後に、column -t出力は整列されたテーブルに再フォーマットされます。これがなければ、列はすべて空白で区切られ、ギザギザになります。

答え2

CSV接続やりたいことをします左外部結合まず、各ファイルでNAMEとSURNAMEを連結してキーとして使用できるようにするか、-cオプションを使用してこれらのフィールドを組み合わせてキーとして使用する場合。

関連情報