2つのファイルを比較し、最初の列と2番目の列に基づいて2番目のファイルから一致しない行を取得します。

2つのファイルを比較し、最初の列と2番目の列に基づいて2番目のファイルから一致しない行を取得します。

次のように、2つのパイプで区切られたファイルがあります。

ファイル1

TEST|123456
TEST|123457
TEST|123458
TEST|123459
TEST|123460

ファイル2

TEST|123456|RAY|DOE||
TEST|123457|JANE|DOE||
TEST|123458|ROSE|DAWN||
TEST|123459|GEORGE|BRID||
TEST|123460|RALPH|DOE||
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

ファイル3 - 希望の出力

TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

file1とfile2の最初の列と2番目の列をキーとして使用して、file2から一致しない行を取得したいと思います。

答え1

joinGNU coreutilsには、-v2つのソースファイルのいずれかでペアリングできない行を印刷するオプションがあります。これを使用して一致を反転することはうまくいきます。

$ cat file1.txt
TEST|123456
TEST|123457
TEST|123458
TEST|123459
TEST|123460

$ cat file2.txt
TEST|123456|RAY|DOE||
TEST|123457|JANE|DOE||
TEST|123458|ROSE|DAWN||
TEST|123459|GEORGE|BRID||
TEST|123460|RALPH|DOE||
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

$ join -t '|' -j 2 -o '2.1,2.2,2.3,2.4' -v 2 file1.txt file2.txt
TEST|123461|JOHN|DOE
TEST|123462|STEVE|SMITH

答え2

努力する:

$ awk -F'|' 'FNR==NR{a[$1,$2]=1; next}  !a[$1,$2]' file1 file2
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

どのように動作しますか?

  • -F'|'awk に|フィールド区切り文字として使用するよう指示します。

  • FNR==NR{a[$1,$2]=1; next}

    最初のファイル()に属する行の場合、これはkeyとvalueを使用して関連配列にFNR==NR項目を追加するようにawkに指示します。a$1,$21

  • !a[$1,$2]

    これはawkに!a[$1,$2]trueのすべての行を印刷するように指示します。!これは論理的な否定であるため、a[$1,$2]false(0)の行を印刷することを意味します。

    これは、私たちが設定した行をa[$1,$2]=1スキップすることを意味します(印刷されていません)。別の行が印刷されます。

答え3

Grep はオプションで、ファイル内で一致させる正規表現を取得します。
最初のファイルを正規表現にするには、^各行の先頭にaを追加します。たとえば、sedコマンドを使用してこれを実行できますsed 's/.*/^&/' file1

次に、sedの出力を次のようにgrepに供給します(ksh、zsh、bash)。

grep -vf <(sed 's/.*/^&/' file1) file2

答え4

ソフトウェアツール方法:

sort -r file[12] | uniq -u -w11 | tac

関連情報