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
join
では、ファイルがjoin
)へのesampleの引数にあるため、ファイルを事前に並べ替える必要があります。したがって、outputのシーケンスを管理する必要がある場合は、別のアプローチが必要です。元のフィールド間隔の幅を維持しようとしないことに注意してください。
join -1 2 -2 2 -v 1 <(sort file1) <(sort file2)
出力
21 12342 2
21 12349 7
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
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$
egrep
とawk
の使用:
_egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
_
<()
内のawk
ビットは、_file2
_の内容に基づいてパターンを生成します。 egrep
は、これらのパターンを使用して_file1
_の行を照合し、_-v
_は照合を反転して、一致しない行のみを出力します。