.

jsyong91의 이미지
김정균의 이미지

[user@machine shm]$ diff -urNp a.txt b.txt
--- a.txt       2014-06-26 23:38:10.423086691 +0900
+++ b.txt       2014-06-26 23:38:09.723075039 +0900
@@ -6,7 +6,7 @@ end
 
 start
 kkkk
-cccc
+cccd
 end
 
 start

이정도는 안될까요?

jsyong91의 이미지

그런데 제가 하고 싶은 것은 a.txt와 b.txt를 문단끼리 비교해서 다른 곳이 있을 경우 그 문단 전체를 출력해주고 싶습니다.
어떻게 방법이 없을까요??

쉘스크립트로 짜보고 있는데 너무 어렵네요

qiiiiiiiip의 이미지

1.
두 파일의 문단의 개수가 같고,
같은 위치의 두 문단을 비교하는 것이라면
스크립트를 짜서 간단히 해결.

2.
두 파일의 문단의 개수가 다르거나, 같더라도,
한쪽에만 있는 문단이 있거나하는 경우
문단을 한줄로 만들어서 diff 수행후,
다시 문단으로 변환하여 출력

qiiiiiiiip의 이미지

2번째 방법.

파일에는 _ 가 없다고 가정. ( 있으면 아래 스크립트에서 _를 다른 없는 문자로. )
문단은 빈줄(no space)로 구분.

$ diff <(perl -00pe 's/\n([^\n])/_\1/g' file1.txt) <(perl -00pe 's/\n([^\n])/_\1/g' file2.txt) | perl -pe 's,^< ,-file1.txt\n,;s,^> ,-file2.txt\n,;s,_,\n,g'
3c3
-file1.txt
start
kkkk
cccc
end
---
-file2.txt
start
kkkk
cccd
end
jsyong91의 이미지

정말 감사합니다~ 잘 동작하네요

그런데 죄송한데 bash가 아니라 csh에서 돌아가게 하려면 방법이 있을까요??

qiiiiiiiip의 이미지

shell을 타는 부분은 <( ) 인데,
csh 는 <( ) 를 지원하지 않아서, 한줄로 하기는 어렵습니다..

스크립트 파일을 따로 만들어서,
<( ) 안의 부분을 임시 파일로 출력하고
두개의 파일에 대해서 diff를 하시면 될듯.

예를 들어,

#!/bin/csh
perl .... file1.txt > temp1
perl .... file2.txt > temp2
 
diff temp1 temp2 | perl ....

이렇게 하시면 될듯요..

bacon의 이미지

awk의 RS나 perl의 $RS를 사용하면 문단단위로 읽을수 있으니 쉽게 처리가능하겠네요. 문단개수가 같다면 awk로 아래정도되겠네요.

awk 'BEGIN {
        RS = "\n\n\n*";
        while ((getline r1 <"file1.txt") > 0 && (getline r2 <"file2.txt") > 0) {
                if (r1 != r2) {
                        printf ("-file1.txt:\n%s\n\n", r1);
                        printf ("-file2.txt:\n%s\n\n", r2);
                }
        }
}'

한쪽파일에 남는부분 추가로 출력해주면 문단개수가 다른경우도 처리 되겠네요.