両方のファイルを比較する必要があります。列 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
使用egrep
とawk
:
egrep -v -f <(awk '{printf "^%s[ ]+%s[ ]+\n", $1, $2}' file2) file1
awk
内部のビットは<()
の内容に基づいてパターンを生成しますfile2
。これらのパターンを使用してegrep
行を一致させ、一致を反転し、一致しない行のみをfile1
印刷-v
します。