예를 들어:
파일 1.txt:
I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.
파일 2.txt
I need to buy apples.
I need to run the laundry.
I need to wash the car.
I need to get the car detailed.
파일 3.txt
I need to wash the car.
이렇게 하면 diff file1.txt file2.txt
diff 명령은 file2.txt에 있는 경우 file3.txt에 있는 명령문을 무시해야 합니다. 따라서 이 경우에는 차이가 없어야 합니다.
무시 플래그( diff -I "$line"
)를 사용하면 두 파일 모두에서 패턴을 찾을 수 있으므로 도움이 되지 않습니다.
어떻게 해야 하나요?
답변1
해결 방법은 해당 행을 삭제한 다음 비교하는 것입니다. 즉, 둘 다 다음과 file1
같습니다 file2
.
I need to buy apples.
I need to run the laundry.
I need to get the car detailed.
grep
perl
, 및 다음을 조합하여 이 작업을 수행 할 수 있습니다 sed
.
$ lines_to_ignore=$(grep -nFf file3 file2 | perl -pe 's|^(\d+):.*|$1s/.//g;|')
$ echo $lines_to_ignore
3s/.//g;
$ diff <(sed "$lines_to_ignore" file1) <(sed "$lines_to_ignore" file2)
$ echo $?
0
- 나는
grep
(행 번호와 함께) 일치하는 행을 얻는 데 사용합니다file2
perl
그런 다음 출력에서 줄 번호를 가져 와서grep
sed 명령을 생성했습니다(Ns/.//g
N 줄의 모든 문자 제거).sed
그런 다음 프로세스 대체를 사용하여 파일에 대해 이러한 명령을 실행한 결과를diff
.
답변2
diff
여기 에서 다음을 결합할 수 있습니다 combine
.
$ diff file1.txt <(combine file2.txt NOT file3.txt)
3d2
< I need to wash the dog.
OP의 변경 사항을 반영하도록 업데이트되었습니다.
답변3
grep 옵션을 사용하여 파일에서 행 필터링
$ diff f1 f2
3c3
< I need to wash the dog.
---
> I need to wash the car.
$ diff <( grep -v -f f3 -x f1) <( grep -v -f f3 -x f2)
3d2
< I need to wash the dog.
어디
<( )
임시 파일을 생성하기 위한 bash 구문입니다.- grep에서
-x
거짓말 전체를 일치시키다-f f3
f3 파일에서 패턴 가져오기-v
일치하지 않는 패턴 표시
답변4
diff
아마도 올바른 도구가 아닐 것입니다. 꼭 써보셔야 할 것 같습니다comm
, 각 줄을 하나의 파일, 다른 파일 또는 두 파일 모두에 공통으로 분류합니다.
그러나 주요 제한은 comm
두 입력 파일을 모두 정렬해야 한다는 것 입니다.