Join 명령은 대용량 파일을 비교할 때 출력을 제공하지 않습니다.

Join 명령은 대용량 파일을 비교할 때 출력을 제공하지 않습니다.

여기에 이미지 설명을 입력하세요.아래와 같이 2개의 파일이 있습니다. 한 파일은 20GB이고 다른 파일은 MB입니다.

file1.txt (100 MB)

6000000
6000001
6000003
file2.txt (20 gb) 

6000000;dgdfgdfgdfgdfgdggeewtwtwtwetewtt
6000003;eryeyyrtuytityiytititityityiytii
6000005;qwrwqrwqrrrrerewrwerewrwrrrewrew

다음과 같이 일치하는 모든 콘텐츠와 출력을 원합니다.

6000000;dgdfgdfgdfgdfgdggeewtwtwtwetewtt
6000003;eryeyyrtuytityiytititityityiytii

이제 두 파일 모두에 대해 정렬 명령을 사용하고 아래 명령을 연결했지만 출력이 나오지 않습니까? 여기서 무엇이 잘못되었는지 도와주세요.

join -t';' file1.txt file2.txt >> file3.txt

답변1

다른 사람들이 이미 언급했듯이 첫 번째 파일은 미리 유닉스 줄 끝으로 변환되어야 합니다. 그러나 파일 자체를 변경할 필요는 없습니다. 대신, 즉시 변환을 시도해 볼 수 있습니다.

명령줄을 다음과 같이 변경합니다.

join -t';' <(dos2unix file1.txt) file2.txt >> file3.txt

두 파일 모두 do로 끝나는 경우 다음을 사용하십시오.

join -t';' <(dos2unix file1.txt) <(dos2unix file2.txt) >> file3.txt

답변2

CRLFDOS 유형의 줄 바꿈( ) 이 있고 join파일을 이해할 수 없습니다.

  • 옵션 1dos2unix: 저장소의 파일을 사용하여 변환합니다.
dos2unix file1.txt file2.txt

이렇게 하면 파일이 변경됩니다. 다음에 어떤 프로그램이 파일을 읽는지에 따라 결과를 다시 변환해야 할 수도 있습니다 unix2dos file3.txt. 무엇을 추측해야 할까요?

  • 옵션 2: 레코드 구분 기호 awk로 사용 :\r\n
awk ' BEGIN {FS=";" ; RS="\r\n" }
      NR==FNR { marker[$1]=$1 }
      NR!=FNR && $1 in marker ' file1.txt file2.txt

여기서의 장점은 개행 문자가 그대로 유지되고 20GB 파일이 읽기만 되고 처리되지 않는다는 것입니다. 이는 임시 파일 쓰기에 더 좋습니다.

노트두 파일 모두 DOS 스타일 솔루션이라고 가정합니다 awk. file"매우 긴 줄"이 포함되어 있다면 실제로는 의미가 없습니다.

답변3

귀하의 파일 file1.txt(적어도 둘 다)은 DOS 텍스트 파일입니다. Unix 시스템에서 텍스트 파일로 사용되는 경우 DOS 텍스트 파일에는 각 줄 끝에 추가 캐리지 리턴 문자가 있습니다.

각 줄 끝의 추가 캐리지 리턴은 첫 번째 파일의 데이터 해석을 방해하므로 join첫 번째 파일의 끝에 있는 캐리지 리턴이 있는 데이터와 캐리지 리턴이 포함되지 않은 데이터를 일치시키려고 합니다. 끝에 캐리지 리턴이 있습니다(두 번째 파일의 첫 번째 필드). 이는 일치하는 조인 키 쌍이 없으며 어떤 출력도 얻을 수 없음을 의미합니다.

파일을 Unix 텍스트 파일로 변환과 같은 도구를 사용 dos2unix하고 명령을 다시 시도하십시오 join.

시스템 관리 작업을 수행하지 않을 때는 루트 사용자 계정 대신 권한이 없는 사용자 계정을 사용하는 것도 고려해야 합니다. 일상적인 작업을 수행하기 위해 루트 계정을 사용하는 것은 Unix 시스템에서 일반적으로 시행하는 대부분의 보안 조치(예: 기본 파일 및 디렉터리 권한 등)를 비활성화하므로 무책임합니다.

관련 정보