아래와 같이 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
CRLF
DOS 유형의 줄 바꿈( ) 이 있고 join
파일을 이해할 수 없습니다.
- 옵션 1
dos2unix
: 저장소의 파일을 사용하여 변환합니다.
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 시스템에서 일반적으로 시행하는 대부분의 보안 조치(예: 기본 파일 및 디렉터리 권한 등)를 비활성화하므로 무책임합니다.