次のように、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
join
GNU coreutilsには、-v
2つのソースファイルのいずれかでペアリングできない行を印刷するオプションがあります。これを使用して一致を反転することはうまくいきます。
$ 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,$2
1
!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