[완료] awk 또는 쉘스크립트로 두개의 파일 비교하기
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 만으로도 가능한가요?
만약 불가능하다면 이런 경우는,
쉘 스크립트를 어떻게 작성해야 하는지 아시는 분 답변 꼭 좀 부탁드리겠습니다.
읽어주셔서 감사합니다.
좋은 하루 되세요...
파일을 직접
파일을 직접 읽으시려면 getline을 쓰시면 됩니다.
예제로 짜보면...
두 파일에서 레코드 일대일 대응하는 것이라면, 그러니까 A파일의 i번째
레코드가 B파일의 i번째 레코드에 대응하는 것이라면,
그리고 각 레코드의 필드도 일대일 대응하는 것이라면,
그리고 파일이 덩치도 상당히 커서 통째로 메모리에 올리는 것이 적절하지 않을 경우,
한번 쓰고 버릴 스크립트로 고민하지 않고 나이브하게 짠다면,
실행은 이렇게...
결과는 이렇게...
포맷은 마음에 안 드실 것 같은데... 적절하게 바꾸세요...
====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas
====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas
xxdiff 나 tkdiff 를
xxdiff 나 tkdiff 를 사용하용해 보시면 좋을 것 같네요.
텍스트 환경에서만 사용해야되면 안되구요.
두 분 답변 정말
두 분 답변 정말 감사드립니다.
비록 다른 방법으로 해결하기는 했지만,
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
위와 같은 식으로 제대로 출력되더군요.
물론 실제는 보기 좋게 좀 꾸몄습니다.
다시한번 답변 주신 분들 감사드립니다.
굵고 짧게!
댓글 달기