diff가 추가 및 삭제 된 행만 표시하도록하려면 어떻게해야합니까? diff가 할 수 없다면 어떤 도구를 사용할 수 있습니까?
답변
통신을 시도
그것을 보는 또 다른 방법 :
-
파일 a에만 존재하는 행을 표시합니다 (예 : a에서 삭제 된 행).
comm -23 a b
-
파일 b에만 존재하는 줄 표시 : (즉 b에 추가 된 내용)
comm -13 a b
-
한 파일 또는 다른 파일에만 존재하는 줄 표시 : (둘다는 아님)
comm -3 a b | sed 's/^\t//'
(경고 : 파일 a
에 TAB으로 시작하는 줄이 있으면 출력에서 첫 번째 TAB이 제거됩니다.)
정렬 된 파일 만
참고 :comm
제대로 작동하려면 두 파일을 모두 정렬해야합니다 . 정렬되지 않은 경우 정렬해야합니다.
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
파일이 너무 길면 추가 사본이 필요하므로 디스크 공간이 두 배나 필요하기 때문에 상당한 부담이 될 수 있습니다.
답변
comm
당신이 원하는 것을 할 수 있습니다. 매뉴얼 페이지에서 :
기술
정렬 된 파일 FILE1과 FILE2를 한 줄씩 비교하십시오.
옵션이 없으면 3 열 출력을 생성합니다. 열 1에는 FILE1에 고유 한 행이 있고 열 2에는 FILE2에 고유 한 행이 있고 열 3에는 두 파일에 공통 인 행이 있습니다.
이러한 열은과 suppressable 있습니다 -1
, -2
그리고 -3
각각.
예:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
그리고 고유 한 줄을 원하고 어떤 파일에 있는지 신경 쓰지 않으면 :
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
매뉴얼 페이지에서 알 수 있듯이 파일을 미리 정렬해야합니다.
답변
문맥, 줄 번호, +,-, <,>없이 추가 및 삭제를 표시하려면! 등, 당신은 다음과 같이 diff를 사용할 수 있습니다 :
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
예를 들어, 두 개의 파일이 주어지면 :
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
다음 명령은 a에서 제거되었거나 b에 추가 된 행을 보여줍니다.
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
산출:
B-ONLY
A-ONLY
이 약간 다른 명령은 a.txt에서 제거 된 행을 표시합니다.
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
산출:
A-ONLY
마지막으로이 명령은 a.txt에 추가 된 줄을 보여줍니다.
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
산출
B-ONLY
답변
이것이 기본적으로 diff의 기능입니다. 공백을 무시하려면 플래그를 추가해야합니까?
diff -b -B
빈 줄과 다른 수의 공백을 무시해야합니다.
답변
아니요, diff
실제로 두 파일의 차이점을 생각하지는 않습니다. patch
한 파일을 다른 파일로 변경하는 데 사용 하는 도구에 대한 일련의 편집 명령을 생성합니다 .
찾고있는 것을하기위한 시도의 어려움은 변경된 줄과 추가 된 줄을 변경 한 줄을 구성하는 방법을 정의하는 것입니다. 또한 행이 서로 추가, 삭제 및 변경 될 때 수행 할 작업.
답변
시각적 비교 도구는 두 줄의 파일을 맞추므로 줄 수는 같지만 내용이 다른 세그먼트는 변경된 세그먼트로 간주됩니다. 일치하는 세그먼트 사이의 완전히 새로운 라인은 추가 된 세그먼트로 간주됩니다.
이 방법도 아니면 sdiff 명령 줄 도구 단말기에 두 개의 파일의 병렬 비교를 도시하는 동작. 변경된 줄은 | 캐릭터. 파일 A에만 행이 있으면 <가 구분 문자로 사용됩니다. 파일 B에만 행이 있으면>가 분리 자로 사용됩니다. 파일에 <및> 문자가없는 경우이를 사용하여 추가 된 행만 표시 할 수 있습니다.
sdiff A B | grep '[<>]'
답변
고마워 senarvi, 귀하의 솔루션 (투표하지 않음)은 실제로 많은 페이지에서 연령대를 찾은 후 내가 원하는 것을 정확하게 제공했습니다.
귀하의 답변을 사용하여 다음은 변경 / 추가 / 삭제 된 항목 목록을 얻기 위해 작성한 것입니다. 이 예에서는 2 가지 버전의 / etc / passwd 파일을 사용하고 관련 레코드의 사용자 이름을 인쇄합니다.
#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'