하나로 병합하려는 고객 정보가 포함된 별도의 파일 두 개가 있습니다. 첫 번째 파일에는 전역 정보가 포함되어 있고 두 번째 파일은 옵션용입니다.
기본적으로 모든 클라이언트는 첫 번째 파일에 항목이 있고 일부 클라이언트만 두 번째 파일에 항목이 있습니다.
내 목표는 (가능한 경우) 중복 열 없이 두 번째 파일을 첫 번째(완전한) 파일로 병합하는 것입니다. 페이스트와 고양이를 시도했지만 성공하지 못했습니다 ...
예:
완료.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"의 다섯 번째 열을 나타냅니다. 출력 형식을 지정하지 않으면 키 열이 먼저 인쇄되고 "전체" 데이터 다음에 반복됩니다.
마지막으로 column -t
출력은 잘 정렬된 테이블로 다시 형식화됩니다. 이것이 없으면 열이 모두 공백으로 구분되어 들쭉날쭉해집니다.