一致する最初の列(ヘッダーを含む)に基づいて2つのCSVをマージします。

一致する最初の列(ヘッダーを含む)に基づいて2つのCSVをマージします。

2つのCSVファイルがあります。そのうちの1つには多くのデータが含まれています。

メイン.csv

Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet
20001,20010,500,5
20002,20011,400,4
20003,20012,300,3
20004,20013,200,2
20005,20014,200,1

他のCSVファイルには情報が少なくなります。

2020年10月.csv

Order No.,Timestamp,ID
20001,2020-10-01 12:00:00,123456
20002,2020-10-02 13:00:00,123457

私の目標は、October-2020.csvに基づいて新しいCSVファイルを作成し、main.csvの情報を追加することです。共通情報は注文番号です。

出力.csv

Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet,Order No.,Timestamp,ID
20001,20010,500,5,20001,2020-10-01 12:00:00,123456
20002,20011,400,4,20002,2020-10-02 13:00:00,123457

これはどのようにスクリプトで書くことができますか?助けてくれてありがとう。

答え1

両方のファイルのjoin最初のフィールド()のフィールド区切り文字として使用します。Order No.,

join -t, -o1.1,1.2,1.3,1.4,2.1,2.2,2.3 main.csv october-2020.csv > output.csv

そして

$ cat output.csv
Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet,Order No.,Timestamp,ID
20001,20010,500,5,20001,2020-10-01 12:00:00,123456
20002,20011,400,4,20002,2020-10-02 13:00:00,123457

両方のファイルは最初のフィールドですでにソートされているため、手動でソートする必要はありません。Order No.出力に 2 回表示したいので、オプションを使用してフィールド-o(最初の入力ファイルの場合はフィールド 1-4、2 番目のファイルの場合はフィールド 1-3) を指定します。

答え2

csv-sqlite -i main.csv -i october-2020.csv \
   'select i1.invoiceNumber, i1.invoiceAmount, i1.invoiceAmountNet, i2.*
      from input1 i1, input2 i2
     where i1."Order No." = i2."Order No."' | csv-header --remove-types

csv-sqliteのcsv-nix-ツール

関連情報