2つのフラットファイルAとBを比較して、B内のすべてのレコードがAにもあることを確認します。

2つのフラットファイルAとBを比較して、B内のすべてのレコードがAにもあることを確認します。

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

最初の列は一意のキーです。一般的な列にはbcおよびが含まれますe。一般的な行は24およびです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

ファイルに記載されているように他の列がある場合、最も簡単な方法は選択した言語で小さなプログラムを書くことです。ファイルの行が同じ構造でない場合はあまり役に立ちませんdiffcomm

答え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 )

関連情報