두 파일을 쉘 스크립트와 어떻게 비교합니까?


10

두 개의 파일이 주어지면 file1에서 각 줄을 읽고 file2에 있는지 확인하는 쉘 스크립트를 작성하려고합니다. 줄을 찾을 수 없으면 두 파일을 다르게 출력하고 종료해야합니다. 파일에는 단어 번호 나 다른 것이 포함될 수 있습니다. 예를 들면 다음과 같습니다.

file1 :

Hi!
1234
5678
1111
hello

file2 :

1111
5678
1234
Hi!
hello

이 경우 두 파일이 같아야합니다. file2에 "hello !!!"가있는 경우 "hello"대신 파일이 다릅니다. bash 스크립트를 사용하고 있습니다. 어떻게해야합니까? 중첩 루프에서 수행 해야하는 것은 중요하지 않지만 이것이 유일한 방법이라고 생각합니다. 당신의 도움을 주셔서 감사합니다.

답변:



10

diff종료 상태를 설정하여 파일이 동일한 지 여부를 나타냅니다. 종료 상태는 특수 변수에서 액세스 할 수 있습니다 $?. 이그나시오의 답변을 다음과 같이 확장 할 수 있습니다.

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
if diff ... >/dev/null대괄호와 변수없이 할 수 있습니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

1

[[]] && || 구성은 매우 깔끔합니다.

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

작동해야합니다 :

comm -3 file1 file2

나는 이것이 충분한 대답이라고 생각합니다 ...


1

동안 diff완벽하게 잘 대답은, 아마도 사용하는 거라고 cmp두 파일의 바이트 비교하여 바이트를하기 위해 특별히 인 대신.

https://linux.die.net/man/1/cmp

이 때문에 바이너리 파일을 비교할 수 있다는 추가 보너스가 있습니다.

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

diff개인적으로 테스트하지는 않았지만 사용하는 것보다 빠르다고 믿었습니다 .


"파일이 다릅니다"사례가 먼저 진행되지 않습니까? if 테스트는 어떤 것이 참인지, 즉 0이 아닌 리턴 코드인지 묻습니다. 파일이 일치하면 cmp는 맨 페이지 당 0을 반환하므로 두 번째 경우입니다.
user8162

@ user8162 당신이하는 말은 이해가되지만 방금 테스트를 마쳤습니다. 이것이 왜 정직한 지 잘 모르겠습니다.
Richard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.