web-dev-qa-db-ja.com

2つのファイルを比較します。1つの列の比較により、一方に存在する行が他方には存在しない

2つのファイルを比較する必要があります。列1は両方のファイルで同じです。列2は、比較したいものです。列2を比較するときに、ファイル2にないファイル1のすべての行が必要です。列3は、列1と列2が同一の行であっても、両方のファイルで異なります。列3を削除できません。出力として、この列を含むファイル1の行が必要だからです。

次に例を示します。

ファイル1

21  12340   3
21  12341   7
21  12342   2
21  12343   89
21  12349   7

ファイル2

21  12340   55
21  12341   7
21  12343   89
21  12344   7
21  12346   88
21  12347   3
21  12348   37

私の出力は次のようになります。

21  12342   2
21  12349   7
6
newbi

joinでは、ファイルがjoin)へのesampleの引数にあるため、ファイルを事前に並べ替える必要があります。したがって、outputのシーケンスを管理する必要がある場合は、別のアプローチが必要です。元のフィールド間隔の幅を維持しようとしないことに注意してください。

join -1 2 -2 2 -v 1 <(sort file1) <(sort file2)

出力

21 12342 2
21 12349 7
8
Peter.O

1つのawkソリューション:

awk '
    FNR == NR {
        data[ $2 ] = 1;
        next;
    }
    FNR < NR {
        if ( ! ($2 in data) ) {
            print $0;
        }
    }
' file2 file1

結果:

21  12342   2
21  12349   7
6
Birei

Pythonをbashシェルから使用する:

paddy$ python -c 'import sys
with open(sys.argv[2]) as f: file2col2 = {line.split()[1] for line in f}
with open(sys.argv[1]) as f: print("".join(line for line in f 
                                           if line.split()[1] not in file2col2))
' file1.tmp file2.tmp
21  12342   2
21  12349   7

paddy$ 
3
Paddy3118

egrepawkの使用:

_egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
_

<()内のawkビットは、_file2_の内容に基づいてパターンを生成します。 egrepは、これらのパターンを使用して_file1_の行を照合し、_-v_は照合を反転して、一致しない行のみを出力します。

2
janos