누락된 키 값을 결합하고 입력하세요.

누락된 키 값을 결합하고 입력하세요.

첫 번째 필드에 기본 키 값이 있고 나머지 필드에 해당 값이 있는 두 개의 파일이 있습니다. 일부 기본 키 값은 한 파일에는 없지만 다른 파일에는 있고 그 반대의 경우도 마찬가지입니다.

$ cat jointest1.txt jointest2.txt  
a 1  
b 2  
d 4  
e 5    

a 10  
b 11  
c 12  
d 13  

출력에서는 누락된 값을 바꾸거나 바꾸지 않고 기본 키를 기반으로 이러한 파일을 병합할 것으로 예상됩니다. 예를 들면 다음과 같습니다.

$ joinmerge  jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
c - 12  
d 4 13  
e 5 -

누락된 값을 대시나 다른 것으로 바꾸는 기능은 선택 사항입니다.

이것을 시도했지만 join파일이 올바르게 정렬되지 않았다고 표시됩니다.

$ join jointest1.txt jointest2.txt   
a 1 10  
b 2 11  
join: file 2 is not in sorted order  
d 4 13  

어떤 명령을 사용해야 합니까?

답변1

다음을 시도해 보십시오:

> join -e- -a1 -a2 jointest1 -o 0 1.1 1.2 2.1 2.2 jointest2
a a 1 a 10
b b 2 b 11
c - - c 12
d d 4 d 13
e e 5 - -

또는

> join -e- -a1 -a2 jointest1 -o 0 1.2 2.2 jointest2
a 1 10
b 2 11
c - 12
d 4 13
e 5 -

-o 옵션 없이 동일한 목표를 달성할 수 있는지/어떻게 달성할 수 있는지 잘 모르겠습니다. -o 옵션은 연결 필드를 먼저 인쇄한 다음 필드 번호를 인쇄한다는 의미입니다. 파일 1의 2, 파일 2의 필드 2. 빈 필드를 작동시키려면 파일 형식을 알아야 한다는 점은 다소 아쉽습니다.

답변2

join어떤 구현을 사용하고 있나요? 그것으로 join (GNU coreutils) 5.97나는 사용할 수 있습니다

[0 1021] ~/temp/jointest % join -a1 -a2 jointest1.txt jointest2.txt
a 1 10
b 2 11
c 12
d 4 13
e 5 

"일반" 조인도 작동합니다(단, c와 e는 생략됨). 빈 필드에 대한 태그를 선택할 수 있는 옵션이 있지만 -e제 버전에서는 문제가 있는 것 같고 케이스 c가 아닌 케이스 e만 채웁니다.

답변3

나는 이 핵심 값 문제에 대한 Perl 도구를 작성했습니다.

올바른 줄 쌍: 파일 개수 제한 없음. 합격할 수도 있습니다GitHub.

실행하려면 다음을 입력하십시오.

merge -k -e "-" jointest1.txt jointest2.txt

관련 정보