별도의 csv 파일을 결합하는 스크립트

별도의 csv 파일을 결합하는 스크립트

하나로 병합하려는 고객 정보가 포함된 별도의 파일 두 개가 있습니다. 첫 번째 파일에는 전역 정보가 포함되어 있고 두 번째 파일은 옵션용입니다.

기본적으로 모든 클라이언트는 첫 번째 파일에 항목이 있고 일부 클라이언트만 두 번째 파일에 항목이 있습니다.

내 목표는 (가능한 경우) 중복 열 없이 두 번째 파일을 첫 번째(완전한) 파일로 병합하는 것입니다. 페이스트와 고양이를 시도했지만 성공하지 못했습니다 ...

예:

완료.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

joincoreutils의 일부이므로 모든 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출력은 잘 정렬된 테이블로 다시 형식화됩니다. 이것이 없으면 열이 모두 공백으로 구분되어 들쭉날쭉해집니다.

답변2

CSV 연결당신이 원하는 것을 할 것입니다왼쪽 외부 조인, 먼저 각 파일에서 NAME과 SURNAME을 연결하여 키로 사용할 수 있도록 하거나 -c 옵션을 사용하고 이러한 필드를 결합하여 키로 사용할 경우.

관련 정보