ファイルから値を読み取り、別のファイル内の対応する行を印刷します。

ファイルから値を読み取り、別のファイル内の対応する行を印刷します。

2つの異なるファイルがあります。ファイル1には100万のエントリがあり、ファイル2には130万のエントリがあります。私のファイル1は次のようになります

A  54 54 67 abcd
C 54 4 1.2 lmno
D 43 2 22.2 asdasd

File2は次のようになります。

A 0 1.1 1 qr
D 2 1 1 rerlm

ただし、file1にはfile2よりも多くのエントリがあります。すべての列1の値がfile2に表示されるわけではありません。他のすべての列は異なります。

file2の最初の列に一致するfile1のすべての行を印刷する必要があります。つまり、file1 のすべての行は、最初の列エントリが file2 に存在するかどうかに応じて file3 に印刷され保存されます。

ベストアンサー1

簡単な解決策は次のとおりです。joinこれを行うためのコマンドです。

これが必要です両方のファイルがソートされました。joinこれらの場合にのみ...次のものを使用できます。sortファイルがソートされていない場合、ファイルはソートされます。

また、出力フィールドを1つずつ指定する必要があるため、最初のファイル(印刷するファイル)のフィールド数が固定されているとします。

また、このソリューションは、ソリューションのフィールド間のスペースを変更できると仮定します。 file1がソートされていない場合は、最終結果の順序を受け入れることができます(file1の順序を必ずしも維持する必要はありません)。

したがって、これらの制限を抱えて生きることができると仮定すると、次のことが必要です。

$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd

ファイルがソートされていない場合は、簡単な方法は次を使用することです。Bashプロセスの交換インスタントで分類し、次のターゲットに供給しますjoin

$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)

(ファイルが大きく、数百万行がある場合は、並べ替える必要がないように並べ替え結果を保存することをお勧めします。)

これはロケール(ソート順を定義する)によって異なり、ファイルにスペースがある場合は先行スペースをスキップするsortオプションを渡すこともできます-b。マニュアルページでは、ソート順の制御と使用をjoin推奨しsort -k 1b,1、議論します。LC_COLLATE参加...この問題を解決するための良いスタートになることを願っています!

おすすめ記事