file1을 file2와 비교하고 file2에없는 file1의 줄을 포함하는 file3을 생성하고 싶습니다.
답변
diff (1)은 답이 아니지만 comm (1)은 답입니다.
NAME
comm - compare two sorted files line by line
SYNOPSIS
comm [OPTION]... FILE1 FILE2
...
-1 suppress lines unique to FILE1
-2 suppress lines unique to FILE2
-3 suppress lines that appear in both files
그래서
comm -2 -3 file1 file2 > file3
입력 파일을 정렬해야합니다. 그렇지 않은 경우 먼저 정렬하십시오. 이것은 임시 파일로 할 수 있습니다.
comm -2 -3 <(sort file1) <(sort file2) > file3
쉘이 프로세스 대체를 지원하는 경우 (bash는 지원함).
답변
Unix 유틸리티 diff
는 정확히이 목적을위한 것입니다.
$ diff -u file1 file2 > file3
옵션, 다른 출력 형식 등은 설명서와 인터넷을 참조하십시오.
답변
이것을 고려하십시오 :
파일 a.txt :
abcd
efgh
b.txt 파일 :
abcd
다음과 같은 차이점을 찾을 수 있습니다.
diff -a --suppress-common-lines -y a.txt b.txt
출력은 다음과 같습니다.
efgh
다음을 사용하여 출력 파일 (c.txt)의 출력을 다시 추출 할 수 있습니다.
diff -a --suppress-common-lines -y a.txt b.txt > c.txt
이것은 귀하의 질문에 답할 것입니다.
“… file2에없는 file1의 행을 포함합니다.”
답변
때로는 diff
필요한 유틸리티이지만 때로는 join
더 적절합니다. 파일은 미리 정렬되어야하며 bash, ksh 또는 zsh와 같은 프로세스 대체를 지원하는 쉘을 사용하는 경우 즉시 정렬을 수행 할 수 있습니다.
join -v 1 <(sort file1) <(sort file2)
답변
시험
sdiff file1 file2
일반적으로 대부분의 경우 훨씬 더 잘 작동합니다. 줄 순서가 중요하지 않은 경우 (예 : 일부 텍스트 구성 파일) 파일을 먼저 정렬 할 수 있습니다.
예를 들면
sdiff -w 185 file1.cfg file2.cfg
답변
coreutils로이 문제를 해결해야하는 경우 허용되는 답변이 좋습니다.
comm -23 <(sort file1) <(sort file2) > file3
정렬이나 처리 대체가 필요하지 않고 무한 스트림을 지원 하는 sd (stream diff) 도 사용할 수 있습니다 .
cat file1 | sd 'cat file2' > file3
아마도이 예에서 그다지 많은 이점은 아니지만 여전히 고려하십시오. 어떤 경우에는 comm
또는 을 사용할 수 grep -F
없습니다 diff
.
여기에 sd를 소개하는 터미널의 diffing stream에 대해 쓴 블로그 포스트가 있습니다.
답변
그러나 grep
해결책이 없습니까?
-
file2에만있는 행 :
grep -Fxvf file1 file2 > file3
-
file1에만있는 행 :
grep -Fxvf file2 file1 > file3
-
두 파일에 모두있는 줄 :
grep -Fxf file1 file2 > file3