Unixで2つのファイルの違いを識別する

Unixで2つのファイルの違いを識別する

私はrec1.txtとrec2.txtという2つのファイルを持っています。

[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

そして、与えられたファイルのキーの順序は重要ではありません。

ファイルの 1 つに末尾のスペースが含まれているので、最初に入力を削除するのが最善です。次のヘルパー関数は、より多くの操作を実行できます。 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でテストされています。

おすすめ記事