[완료] 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번째 레코드에 대응하는 것이라면,
그리고 각 레코드의 필드도 일대일 대응하는 것이라면,
그리고 파일이 덩치도 상당히 커서 통째로 메모리에 올리는 것이 적절하지 않을 경우,
한번 쓰고 버릴 스크립트로 고민하지 않고 나이브하게 짠다면,
# 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 ""; }실행은 이렇게...
결과는 이렇게...
포맷은 마음에 안 드실 것 같은데... 적절하게 바꾸세요...
====
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
위와 같은 식으로 제대로 출력되더군요.
물론 실제는 보기 좋게 좀 꾸몄습니다.
다시한번 답변 주신 분들 감사드립니다.
굵고 짧게!
댓글 달기