2 つのファイルの比較

ちょうど IRC でも同じような話題が出ていたので、awkマッチングから取り上げたいと思います。

個人的には FILENAME を指定してあげるのが良いと思っていますが、順序が決まっているような場合には NR と FNR を使うのが効率的です。 具体的には NR == FNR であれば最初のファイル、NR != FNR であれば 2 番目のファイルという扱いになります。

$ cat file1
red 100
blue 150
yellow 200
red 101

$ cat file2
yellow L
green X
blue M
red S
red M

このような場合に以下のようにします。

$ awk 'NR==FNR{data1[$1]++;data2[$1]=$2;next}$1 in data1{print  $1" "data2[$1]" "$2}' file1 file2

なかなか分かりにくいのですが、NR == FNR の部分が最初の file1 の部分の読み込みです。 また、$1 in data1 の部分が 2 番目のファイルの読み込みの部分です。 data1 へ格納することで 2 番目のファイルでは配列の検索でマッチさせています。

IRC で話題になったのは /etc/passwd ファイルと /etc/shadow ファイルの比較を行いたいというものでしたが、基本的に同じものでした。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png