diff는 2 개의 파일에서 다른 것과 동일한 행을보고합니다


13

노래 목록이 들어있는 2 개의 파일이 있습니다. hdsongs.txt 및 sdsongs.txt

모든 노래를 나열하고 텍스트 파일로 출력 한 다음 diff를 실행하는 간단한 스크립트를 작성했습니다. 대부분 잘 작동하지만 스크립트의 실제 diff 명령은 다른 줄과 동일한 줄을 보여줍니다. 이것은 실제로 여러 줄에서 발생하지만 전부는 아닙니다.

다음은 두 파일에있는 노래의 예입니다.

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

내가 볼 수있는 후행 특수 문자는 없습니다.

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

diff를 실행하면 각 파일에 동일한 줄이 표시됩니다. 하지만 줄이 같지 않습니까?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

이것은 스레드와 비슷합니다. diff는 두 파일이 서로 다르지만보고합니다!

그러나 이것은 전체 파일이 아니라 파일 내의 행에 대한 것이며 해상도는이 경우에 맞지 않는 것 같습니다.

$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$

$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3

diff가 왜 같은 줄을 두 번보고하는지 아는 사람이 있습니까?


어쩌면 hexdump그 두 줄을 시도 하고 다른 점을 보십니까?
user43791 December

답변:


23

내 생각 엔 당신은 단순히 파일을 정렬하지 않은 것입니다. 그것은 정렬되지 않은 입력에서 얻을 수있는 행동 중 하나입니다.

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

그러나 정렬하면 다음과 같습니다.

$ diff <(sort file1) <(sort file2)
$ 

diff프로그램의 작업은 다른 곳이 아닌 경우 두 파일이 동일하고 여부를 알려주는 것이다. 서로 다른 선 사이의 유사점을 찾도록 설계되지 않았습니다. 한 파일의 X 행이 다른 파일의 X 행과 같지 않으면 파일이 동일하지 않습니다. 정보가 정확히 동일한 정보를 포함하는지 여부는 중요하지 않습니다. 해당 정보가 다른 방식으로 구성되어 있으면 파일이 다르게보고됩니다.


4

파일이 정렬되어 있다고 말하지 않았으므로 파일이 정렬되지 않았다고 가정합니다. 이것은 diff 두 파일에 모두 다른 위치에 줄이 나타날 때 예상되는 결과입니다 . 전체 diff출력을 보지 않고 전체 출력 을 살펴보면 분명합니다 grep.


2

육안으로 컴퓨터가 표시하는 문자의 차이를 항상 알 수는 없으며 일부 문자가 표시되지 않을 수 있으므로 hexdiff 프로그램과 같은 것을 사용하여 이진 / 16 진수 출력을 얻으십시오.


2
cat -A비 인쇄 문자의 대부분 (모두?)을 표시했을 것입니다. 유니 코드 이상한 점에 어떻게 대처했는지 잘 모르겠지만 다른 비 인쇄 문자가 표시되어야합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.