2017-02-10 5 views
1

私はfile1とfile2という2つのファイルを持っています。 file1の$ 1、$ 2、$ 3、$ 4の複数の列をfile2の$ 1、$ 2、$ 3、および$ 4の複数の列と比較して、file1のどの行とも一致しないfile2の行を出力したいと考えています。異なるファイルの列を比較し、一致しない列を出力する

など。

file1の

aaa bbb ccc 1 2 3 
aaa ccc eee 4 5 6 
fff sss sss 7 8 9 

FILE2

aaa bbb ccc 1 f a 
mmm nnn ooo 1 d e 
aaa ccc eee 4 a b 
ppp qqq rrr 4 e a 
sss ttt uuu 7 m n 
fff sss sss 7 5 6 

私は出力として持つようにしたい:

mmm nnn ooo 1 d e 
ppp qqq rrr 4 e a 
sss ttt uuu 7 m n 

私は、一致しないものを発見し、それらを印刷するためにここに質問を見てきましたしかし、それは一致しないものではありません。

ありがとうございました!

答えて

2

は、次のスクリプトを使用:

awk '{k=$1 FS $2 FS $3 FS $4} NR==FNR{a[k]; next} !(k in a)' file1 file2 

kは(comments参照)FSで区切られ、列1234の連結値であり、検索にキーとして使用されます配列aNR==FNRtrueであり、一方ではfile1である。私はという配列をkで、file1を読んで作成しています。

入力の残りの部分については、aにインデックスが存在しない場合は!(k in a)でチェックします。それがtrueawkと評価された場合、その行が印刷されます。

+1

反転状態でawkソリューションを使用することで、カタリナは「ないで」の説明のための –

+0

おかげで、それが動作するようになりました望んでいます! –

+0

あなたは歓迎します – hek2mgl

1

@ hek2mglからawkソリューションは、これよりも優れているが、情報のために、これはuniqsort、およびrev使用も可能であることは間違いありません:

rev file1 file2 | sort -k3 | uniq -u -f2 | rev 

rev右から左に両方のファイルを元に戻すさを。

sort -k3は、2番目の列をスキップする行をソートします。

uniq -u -f2は、一意の行だけを表示します(比較時には最初に2をスキップします)。

最後にrevが改行を戻しています。

この解決策は、両方のファイルの行を並べ替えます。それは望ましくないかもしれない。

2

ファイルがソートされていて、使用されている文字セットが分かっている場合は、別の方法があります。

$ function f(){ sed 's/ /~/g;s/~/ /4g' $1; }; join -v2 <(f file1) <(f file2) | 
    sed 's/~/ /g' 

mmm nnn ooo 1 d e 
aaa ccc eee 4 a b 
ppp qqq rrr 4 e a 
sss ttt uuu 7 m n 
fff sss sss 7 5 6 

FILE2から不一致エントリを検索し、バック合成キーフィールドを分割するjoinを使用し、(~チャーと、任意の未使用の文字を使用することができる)最初の4つのフィールドを連結することによって、キーフィールドを作成します。

しかし、最善の方法は、わずかな修正

$ awk 'NR==FNR{a[$1,$2,$3,$4]; next} !(($1,$2,$3,$4) in a)' file1 file2 
関連する問題