나는 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에서 테스트되었습니다.