두 개의 파일이 있습니다. 한 파일이 다른 파일의 하위 집합인 것 같습니다. 두 번째 파일이 첫 번째 파일 내에 있는 위치를 간결하게 식별하기 위해 파일을 비교하는 방법이 있습니까?
답변1
diff -e bigger smaller
트릭을 수행하지만 출력이 "유효한 편집 스크립트"이므로 약간의 설명이 필요합니다.
나는 "bigger"와 "smaller"라는 두 개의 파일을 만들었습니다. 여기서 "smaller"의 내용은 "bigger"의 5~9행과 동일하며 "diff -e 더 큰 더 작은"을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
% diff -e bigger smaller
10,15d
1,4d
이는 "'더 큰' 행 10~15를 삭제한 다음 '더 작은' 행 1~4를 삭제"하는 것을 의미합니다. 이는 "더 작은"이 "더 큰" 행의 5~9번째 행임을 의미합니다.
파일 이름을 바꾸면 상황이 더 복잡해졌습니다. "더 작은"이 "더 큰"의 하위 집합을 형성하는 경우 "d"(삭제용) 명령만 출력에 나타납니다.
답변2
시각적으로 이 작업을 수행할 수 있습니다.퓨전. 불행히도 이는 GUI 도구이지만 비교적 작은 파일에서 한 번만 수행하려는 경우에는 괜찮습니다.
아래 그림은 출력입니다 meld a b
.
답변3
파일이 충분히 작으면 Perl에 모두 넣고 해당 정규식 엔진이 작업을 수행하도록 할 수 있습니다.
perl -0777e '
open "$FILE1","<","file_1";
open "$FILE2","<","file_2";
$file_1 = <$FILE1>;
$file_2 = <$FILE2>;
print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
print " a subset of file_1\n";
'
이 스위치는 파일을 완전히 읽기 위해 -0777
Perl이 입력 레코드 구분 기호를 정의되지 않은 값으로 설정하도록 지시합니다 .$/
답변4
문제는 "차이 파일 헤더"입니다. 한 파일이 다른 파일의 헤더라는 것을 의미하는 경우 간단한 방법 cmp
으로 다음을 알 수 있습니다.
cmp big_file small_file
cmp: EOF on small_file
이는 를 읽는 동안 파일의 끝에 도달할 때까지 두 파일 간의 차이가 감지되지 않음을 나타냅니다 small_file
.
그러나 작은 파일의 전체 텍스트가 내부 어디에나 나타날 수 있다는 의미이고 big_file
두 파일을 모두 메모리에 넣을 수 있다고 가정하면 다음을 사용할 수 있습니다.
perl -le '
use autodie;
undef $/;
open SMALL, "<", "small_file";
open BIG, "<", "big_file";
$small = <SMALL>;
$big = <BIG>;
$pos = index $big, $small;
print $pos if $pos >= 0;
'
big_file
그러면 콘텐츠가 있는 위치의 오프셋이 인쇄됩니다(예: small_file
의 시작 부분에서 일치하는 경우 0). 내부 불일치가 있으면 아무것도 인쇄되지 않습니다. 오류가 발생하면 종료 상태는 0이 아닙니다.small_file
big_file
small_file
big_file