2つのフラットファイルAとBがあります。 Aは何百万ものレコードを含む大容量ファイルで、BはAのサブセットでなければなりません。 Aには一意のキーを持つ20個の列があり、Bには同じ一意のキーを持つ5つの列があります。 BとAを比較して、ファイルBのレコードがファイルAにも存在し、その列に同じデータがあることを確認する方法を教えてください。
答え1
私のコマンドを表示するために2つのファイルを作成しました。
file1
:
1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5
file2
:
2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5
最初の列は一意のキーです。一般的な列にはb
、c
およびが含まれますe
。一般的な行は2
、4
およびです5
。行4
の列に異なる値がありますe
。
出力を含むコマンドは次のとおりです。
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx
ファイルがまだソートされていない場合は、次のことができます。
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)
説明する:
cut -d' ' -f1,3,4,6 file1
ファイルのフィールド番号1、3、4、6を印刷します。フィールドはスペースで区切られます。フィールドがコンマで区切られている場合は、cut
以下を使用してください。cut -d','
<( ... )
comm -1 -3 file1 file2
file2に固有の行を印刷します。
指示:
cut
区切り文字がフィールドに文字として表示される場合、問題が発生します。
たとえば、
"field1","field2,stillfield2","field3"
cut
カンマが"field2,stillfield2"
フィールドの一部であることは理解できません。
ファイルが次のような場合は、csv処理機能を備えたプログラミング言語を使用するのが最善です。例えばPython。
答え2
ファイルに記載されているように他の列がある場合、最も簡単な方法は選択した言語で小さなプログラムを書くことです。ファイルの行が同じ構造でない場合はあまり役に立ちませんdiff
。comm
答え3
ソリューションに加えて、このソリューションをcomm
使用することdiff
もできますgrep
。
関連データがファイルAの列1,3,10であり、ファイルBの列1,2,3であると仮定する。 Aで選択した列を使用し、cut
それをキーワードとしてファイルを一致させ、ファイルBに対応する項目があるかどうかを確認します。ファイルAから抽出された一致する行にない行がファイルBにある場合に表示されます。すべて一致すると、出力はありません(BはAのサブセットである必要があるため)。
grep -wvf <( cut -f1,3,10 fileA ) fileB
またはファイルBに3つ以上の列がある場合:
grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )