.
[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
이정도는 안될까요?
그런데 제가 하고 싶은 것은 a.txt와 b.txt를 문단끼리 비교해서 다른 곳이 있을 경우 그 문단 전체를 출력해주고 싶습니다. 어떻게 방법이 없을까요??
쉘스크립트로 짜보고 있는데 너무 어렵네요
1. 두 파일의 문단의 개수가 같고, 같은 위치의 두 문단을 비교하는 것이라면 스크립트를 짜서 간단히 해결.
2. 두 파일의 문단의 개수가 다르거나, 같더라도, 한쪽에만 있는 문단이 있거나하는 경우 문단을 한줄로 만들어서 diff 수행후, 다시 문단으로 변환하여 출력
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
정말 감사합니다~ 잘 동작하네요
그런데 죄송한데 bash가 아니라 csh에서 돌아가게 하려면 방법이 있을까요??
shell을 타는 부분은 <( ) 인데, csh 는 <( ) 를 지원하지 않아서, 한줄로 하기는 어렵습니다..
스크립트 파일을 따로 만들어서, <( ) 안의 부분을 임시 파일로 출력하고 두개의 파일에 대해서 diff를 하시면 될듯.
예를 들어,
#!/bin/csh perl .... file1.txt > temp1 perl .... file2.txt > temp2 diff temp1 temp2 | perl ....
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); } } }'
한쪽파일에 남는부분 추가로 출력해주면 문단개수가 다른경우도 처리 되겠네요.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
[user@machine shm]$ diff
이정도는 안될까요?
댓글 감사합니다
그런데 제가 하고 싶은 것은 a.txt와 b.txt를 문단끼리 비교해서 다른 곳이 있을 경우 그 문단 전체를 출력해주고 싶습니다.
어떻게 방법이 없을까요??
쉘스크립트로 짜보고 있는데 너무 어렵네요
1. 두 파일의 문단의 개수가 같고, 같은 위치의
1.
두 파일의 문단의 개수가 같고,
같은 위치의 두 문단을 비교하는 것이라면
스크립트를 짜서 간단히 해결.
2.
두 파일의 문단의 개수가 다르거나, 같더라도,
한쪽에만 있는 문단이 있거나하는 경우
문단을 한줄로 만들어서 diff 수행후,
다시 문단으로 변환하여 출력
2번째 방법.파일에는 _ 가 없다고 가정. (
2번째 방법.
파일에는 _ 가 없다고 가정. ( 있으면 아래 스크립트에서 _를 다른 없는 문자로. )
문단은 빈줄(no space)로 구분.
정말 감사합니다~ 잘 동작하네요 그런데 죄송한데
정말 감사합니다~ 잘 동작하네요
그런데 죄송한데 bash가 아니라 csh에서 돌아가게 하려면 방법이 있을까요??
shell을 타는 부분은 <( ) 인데, csh 는
shell을 타는 부분은 <( ) 인데,
csh 는 <( ) 를 지원하지 않아서, 한줄로 하기는 어렵습니다..
스크립트 파일을 따로 만들어서,
<( ) 안의 부분을 임시 파일로 출력하고
두개의 파일에 대해서 diff를 하시면 될듯.
예를 들어,
이렇게 하시면 될듯요..
awk의 RS나 perl의 $RS를 사용하면
awk의 RS나 perl의 $RS를 사용하면 문단단위로 읽을수 있으니 쉽게 처리가능하겠네요. 문단개수가 같다면 awk로 아래정도되겠네요.
한쪽파일에 남는부분 추가로 출력해주면 문단개수가 다른경우도 처리 되겠네요.
댓글 달기