2つのファイル比較:列比較を使用すると、あるファイルには行がありますが、他のファイルには行はありません。

2つのファイル比較:列比較を使用すると、あるファイルには行がありますが、他のファイルには行はありません。

両方のファイルを比較する必要があります。列 1 は両方のファイルで同じです。列2は私が比較したいものです。列2を比較すると、ファイル2に含まれていないファイル1のすべての行が必要です。列 3 は両方のファイルで異なり、列 1 と列 2 が同じ行の場合も同様です。出力としてファイル 1 の行にその列を含めたいので、列 3 を削除できません。

例は次のとおりです。

ファイル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

答え1

joinファイルが例の args にあるように事前にソートする必要があるため、joinファイルの順序を維持する必要がある場合出力、これは別のアプローチが必要です。元のフィールド間隔の幅を維持しようとしません。

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

出力

21 12342 2
21 12349 7

答え2

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

答え3

BashシェルでPythonを使用する:

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$ 

答え4

使用egrepawk:

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

awk内部のビットは<()の内容に基づいてパターンを生成しますfile2。これらのパターンを使用してegrep行を一致させ、一致を反転し、一致しない行のみをfile1印刷-vします。

関連情報