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