[완료] awk 또는 쉘스크립트로 두개의 파일 비교하기

aussie9804의 이미지

awk 또는
쉘스크립트로
두개의 파일 비교하기
질문입니다.

A.txt
111,222,333,888,999,...
aaa,bbb,ccc,ddd,eee,....
...

B.txt
111,222,333,444,555,...
jjj,kkk,ccc,ddd,eee,...
...

diff.txt (결과)
4,5 // A.txt와 B.txt의 첫번째 레코드 4번째, 5번째 필드가 다름
1,2 // A.txt와 B.txt의 두번째 레코드 1번째, 2번째 필드가 다름

위와 같은 형식의 파일이 있을 경우에,
두 파일의 내용을 비교하고 싶습니다.
결과 파일인 diff.txt의 형식은 딱히 정해진 건 아니지만,
A.txt와 B.txt의 내용 중에 틀린 곳이 있다면 몇 번째 필드가 어떻게 틀린지를
표현하고 싶습니다.

diff A.txt B.txt 와 같이 diff 명령은 레코드 길이가 매우 길 경우 - 그것도 대부분이 아주 큰 숫자 값으로 이루어진 - 어느 필드가 다른지 일일이 확인하는 게 매우 어려워서요.

부족한 실력으로 한번 awk을 사용해서 만들어보고자 했습니다만,
awk로 파일 두개를 동시에 컨트롤 하는 것은
제 실력으로는 도저히 모르겠더군요.
awk 만으로도 가능한가요?

만약 불가능하다면 이런 경우는,
쉘 스크립트를 어떻게 작성해야 하는지 아시는 분 답변 꼭 좀 부탁드리겠습니다.
읽어주셔서 감사합니다.
좋은 하루 되세요...

slomo의 이미지

파일을 직접 읽으시려면 getline을 쓰시면 됩니다.

예제로 짜보면...

두 파일에서 레코드 일대일 대응하는 것이라면, 그러니까 A파일의 i번째
레코드가 B파일의 i번째 레코드에 대응하는 것이라면,

그리고 각 레코드의 필드도 일대일 대응하는 것이라면,

그리고 파일이 덩치도 상당히 커서 통째로 메모리에 올리는 것이 적절하지 않을 경우,

한번 쓰고 버릴 스크립트로 고민하지 않고 나이브하게 짠다면,

# compare_cols.awk
BEGIN{
    FS=",";
}
{
    split($0, temparr);
    getline < "B.txt";
    printf NR " ";
    for (i=1;i<=NF;i++) {
	if (temparr[i] != $i ) {
	    printf i " ";
	}
    }
    print "";
}

실행은 이렇게...

$ gawk -f compare_cols.awk A.txt

결과는 이렇게...

1 4 5 
2 1 2 

포맷은 마음에 안 드실 것 같은데... 적절하게 바꾸세요...

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

ysy05의 이미지

xxdiff 나 tkdiff 를 사용하용해 보시면 좋을 것 같네요.
텍스트 환경에서만 사용해야되면 안되구요.

aussie9804의 이미지

두 분 답변 정말 감사드립니다.
비록 다른 방법으로 해결하기는 했지만,
slomo님께서 알려주신 방법으로도 해 봐야겠네요.

참고로 제가 사용한 방법은

paste -d, a.txt b.txt |
awk -F, '
{
cnt=NF/2
for (i=1; i if ($i != $(i+cnt))
print NR, i, $i
}
}

회사에서 작성해 본 것이라서 기억이 잘...
아무튼 이와 같은 식으로 했습니다.

만약 두 파일이 다음과 같다면

A.txt
111,222,333,888,999,...
aaa,bbb,ccc,ddd,eee,....

B.txt
111,222,333,444,555,...
jjj,kkk,ccc,ddd,eee,...

결과는,

1 4 888 444 <- 순서대로 행, 필드, 첫번째 파일의 필드, 두번째 파일의 필드
1 5 999 555
2 1 aaa jjj
2 2 bbb kkk

위와 같은 식으로 제대로 출력되더군요.
물론 실제는 보기 좋게 좀 꾸몄습니다.

다시한번 답변 주신 분들 감사드립니다.

굵고 짧게!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.