일치하는 첫 번째 열(헤더 포함)을 기반으로 두 개의 CSV를 병합합니다.

일치하는 첫 번째 열(헤더 포함)을 기반으로 두 개의 CSV를 병합합니다.

두 개의 CSV 파일이 있습니다. 그 중 하나에는 많은 데이터가 포함되어 있습니다.

메인.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.출력에 두 번 표시되기를 원하므로 옵션을 사용하여 필드 -o(첫 번째 입력 파일의 경우 필드 1-4, 두 번째 파일의 경우 필드 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-도구

관련 정보