파일에서 값을 읽고 다른 파일에 있는 해당 줄을 인쇄합니다.

파일에서 값을 읽고 다른 파일에 있는 해당 줄을 인쇄합니다.

두 개의 서로 다른 파일이 있습니다. 파일 1에는 100만 개의 항목이 있고 파일 2에는 130만 개의 항목이 있습니다. 내 파일 1은 다음과 같습니다

A  54 54 67 abcd
C 54 4 1.2 lmno
D 43 2 22.2 asdasd

File2는 다음과 유사합니다.

A 0 1.1 1 qr
D 2 1 1 rerlm

그러나 file1에는 file2보다 더 많은 항목이 있습니다. 모든 열 1 값이 file2에 나타나는 것은 아닙니다. 다른 모든 열은 다릅니다.

file2의 첫 번째 열과 일치하는 file1의 모든 행을 인쇄해야 합니다. 즉, file1의 모든 행은 첫 번째 열 항목이 file2에 존재하는지 여부에 따라 file3에 인쇄되고 저장됩니다.

답변1

간단한 해결책은 다음과 같습니다.join이를 수행하기 위한 명령입니다.

이것이 필요하다두 파일이 모두 정렬되었습니다., join이러한 경우에만... 다음을 사용할 수 있습니다.sort파일이 정렬되지 않은 경우 파일이 정렬됩니다.

또한 출력 필드를 하나씩 지정해야 하므로 첫 번째 파일(인쇄하려는 파일)의 필드 수가 고정되어 있다고 가정합니다.

또한 이 솔루션은 솔루션의 필드 사이의 공백을 변경할 수 있다고 가정합니다. file1이 정렬되지 않은 경우 최종 결과의 순서를 수락할 수 있습니다(file1의 순서를 반드시 유지할 필요는 없음).

따라서 이러한 제한 사항을 안고 살아갈 수 있다고 가정하면 해야 할 일은 다음과 같습니다.

$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd

파일이 정렬되지 않은 경우 쉬운 방법은 다음을 사용하는 것입니다.Bash 프로세스 교체즉석에서 분류하여 다음 대상에게 공급합니다 join.

$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)

(파일이 크고 수백만 개의 행이 있는 경우 다시 정렬할 필요가 없도록 정렬 결과를 저장하는 것이 좋습니다.)

이는 로케일(정렬 순서를 정의함)에 따라 다르며 파일에 공백이 있는 경우 선행 공백을 건너뛰는 sort옵션을 전달할 수도 있습니다 -b. 매뉴얼 페이지에서는 정렬 순서 제어 및 사용을 join권장 sort -k 1b,1하고 논의합니다 . LC_COLLATE합류...이 문제를 해결하기 위한 좋은 시작이 되기를 바랍니다!

관련 정보