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
出力は整列されたテーブルに再フォーマットされます。これがなければ、列はすべて空白で区切られ、ギザギザになります。