Unix에서 두 파일의 차이점 식별

Unix에서 두 파일의 차이점 식별

나는 rec1.txt와 rec2.txt라는 두 개의 파일을 가지고 있습니다.

[gpadmin@subh ~]$cat ret1.txt
emcas_fin_bi=324 
emcas_fin_drr=3294   
emcas_fin_exp=887 
emcas_fin_optics=0
emcas_gbo_gs=3077

그리고

[gpadmin@subh ~]$ cat ret2.txt 
emcas_fin_bi=333 
emcas_fin_drr=5528 
emcas_fin_exp=1134 
emcas_fin_optics=0 
emcas_fin_revpro=0 
emcas_gbo_gs=3897

내가 제공하는 비교는 다음과 같습니다.

 [gpadmin@subh ~]$ diff -y ret1.txt ret2.txt  
emcas_fin_bi=324 | emcas_fin_bi=333  
emcas_fin_drr=3294 | emcas_fin_drr=5528
emcas_fin_exp=887 | emcas_fin_exp=1134
emcas_fin_optics=0 emcas_fin_optics=0
emcas_gbo_gs=3077 | emcas_fin_revpro=0 
                        >  emcas_gbo_gs=3897

emcas_gbo_gs가 일반적이지만 새로운 단어로 표시되기 때문에 위의 출력이 잘못되었음을 발견했습니다.

emcas_gbo_gs=3077 | emcas_fin_revpro=0
               > emcas_gbo_gs=3897

원하는 출력:-

emcas_gbo_gs=3077 | emcas_gbo_gs=3897   
                      > emcas_fin_revpro=0

답변1

나는 당신이 이 패턴을 따르는 라인을 비교하는 데 관심이 있다고 가정합니다.

key=value

그리고 주어진 파일의 키 순서는 중요하지 않습니다.

파일 중 하나에 후행 공백이 포함되어 있으므로 먼저 입력을 삭제하는 것이 가장 좋습니다. 다음 도우미 함수는 더 많은 작업을 수행할 수 있습니다. none 을 삭제합니다 =. 선행 공백 문자와 후행 공백 문자를 제거합니다. 또한 인접한 공백 문자도 제거합니다 =.

sanitize() { grep '=' "$1" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//; s/[[:space:]]*=[[:space:]]*/=/'; }

또 다른 기능(사용프로세스 교체, POSIX에는 적합하지 않음)

prepare() { diff <(sanitize "$1") <(sanitize "$2") | grep '^[<|>]' | sort -k 2 | uniq -u -f 1; }

변화를 가져올 것입니다. 다음과 같이 사용하세요:

prepare ret1.txt ret2.txt

출력은 다음과 같습니다:

< emcas_fin_bi=324
> emcas_fin_bi=333
< emcas_fin_drr=3294
> emcas_fin_drr=5528
> emcas_fin_exp=1134
< emcas_fin_exp=887
> emcas_fin_revpro=0
< emcas_gbo_gs=3077
> emcas_gbo_gs=3897

이것은 당신이 원하는 결과는 아니지만 꽤 좋습니다.분석 가능한. 즉, 원하는 거의 모든 방식으로 추가 처리가 가능하다는 의미입니다. 예를 들어, 원하는 형식(또는 최소한 이에 가까운 형식)을 얻으려면 awk및 를 사용할 수 있습니다 .column

prepare ret1.txt ret2.txt | awk -F '[ =]' '
    { $1 == "<" ? L[$2]=$3 : R[$2]=$3 }
    END {
         for (key in L) if (key in R) print key"="L[key]"/|/"key"="R[key]
         for (key in L) if (! (key in R)) print key"="L[key]"/<"
         for (key in R) if (! (key in L)) print " />/"key"="R[key]
        }
    ' | column -s / -t

결과 :

emcas_fin_exp=887   |  emcas_fin_exp=1134
emcas_fin_bi=324    |  emcas_fin_bi=333
emcas_fin_drr=3294  |  emcas_fin_drr=5528
emcas_gbo_gs=3077   |  emcas_gbo_gs=3897
                    >  emcas_fin_revpro=0

참고: Debian GNU/Linux 9에서 테스트되었습니다.

관련 정보