2013-11-15 2 views
0

두 파일 a.unl과 b.unl이 있습니다. 내용은 다음과 같습니다.유닉스 - 두 텍스트 파일의 차이점을 인쇄하는 방법?

#a.unl 
300111 
302130 
300042 
300054 
400045 

#b.unl 
200032 
300042 
300111 
565000 
310056 

그리고 차이를 잡으려는 c.unl이 있습니다. a.unl의 행이 b.unl의 행과 일치하면 c.unl에 인쇄되지 않습니다. 그것은 다른 경우에만 인쇄합니다. 어떻게이 작업을 수행 할 수 있습니까?

도움 주셔서 감사합니다.

+1

아마도 'diff'를 사용할 수 있습니까? –

답변

3

가장 좋은 방법은 두 파일을 정렬하고 결과에 comm을 실행하는 것입니다. 당신이 당신의 셸 bash이있는 경우 Process Substitution를 사용할 수 있습니다

comm -3 <(sort a.unl) <(sort b.unl) 

a.unl의 모든 라인을 인쇄 할 수 있지만 b.unl에서, b.unl의 모든 라인을하지만 a.unl (그들은 탭으로 들여 쓰기를하지 않습니다에합니다); -3a.unlb.unl의 줄을 모두 억제합니다. 당신이 필요로하는,

sort a.unl > a.srt 
sort b.unl > b.srt 
comm -3 a.srt b.srt 
rm -f a.srt b.srt 

보다 거의 방탄 있는지 확인하기 위해 (그래서 당신이 일을 방해하는 경우가 주위에 중간 파일을 두지 않음) : 당신이 bash이없는 경우

, 당신은 아마 같은 뭔가가 필요 :

tmp=tmp.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

sort a.unl > $tmp.a 
sort b.unl > $tmp.b 
comm -3 $tmp.a $tmp.b 

rm -f $tmp.? 
trap 0 
+0

고마워요, 이건 정말 작동합니다. Btw, 나는 통신 -13과 "sort a.unl -o a.unl"을 사용하므로 불필요한 파일이 주위에 놓여 있지 않습니다. – junda

3

diff을 사용하면 두 파일의 차이를 알 수 있습니다.

--- a.unl  2013-11-15 13:51:00.936845493 +0800 
+++ b.unl  2013-11-15 13:51:21.373908098 +0800 
@@ -1,5 +1,5 @@ 
+200032 
+400042 
300111 
-302130 
-300042 
-300054 
-400045 
+565000 
+310056 

- 수단은 a.unl에서 삭제 + 수단 a.unl에 추가 :

diff -u a.unl b.unl 

출력처럼 보인다.
자세한 내용을 보려면 man diff을 사용하십시오.

관련 문제