3

次の形式の 2 つのファイルがあります。
File1: - 4 つの列が含まれています。最初のフィールドはテキスト形式の ID で、残りの列もテキスト値です。

id1 val12 val13 val14
id2 val22 val23 val24
id3 val32 val33 val34

File2 - ファイル 2 には ID しかありません。

id1
id2

出力

id3 val32 val33 val34

私の質問は: ID (最初のフィールド) が 2 番目のファイルに表示されない最初のファイルから行を見つける方法です。両方のファイルのサイズはかなり大きく、file1 には 4,200 万行、サイズは 8GB、file2 には 3,300 万の ID が含まれています。2 つのファイルの ID の順序が同じでない場合があります。

4

3 に答える 3

3

2つのファイルがIDでソートされていると仮定すると、次のようになります

join "-t " -j 1 -v 1 file1 file2

するべきです。

于 2013-01-02T23:18:20.513 に答える
2

最良の方法には多くのトレードオフ基準を含めることができるため、これが「最良の」方法であるとは主張しませんが、1 つの方法を次に示します。

これは、次の検索パターンを含むファイルとして-f指定するオプションを使用して行うことができます。File2grep

grep -v -f File2 File1 > output

そして@glennjackmanが示唆するように:

行の先頭で id を強制的に一致させる 1 つの方法:grep -vf <(sed 's/^/^/' File2) File1

于 2013-01-02T23:15:40.413 に答える
2

awk で次のようにすることができます。

awk 'FNR == NR { h[$1] = 1; next } !h[$1]' file2 file1

最初のブロックは、ID をハッシュに収集file2hます。id が に存在しなかった場合、最後の部分 ( !h[$1]) はデフォルト ブロック ( ) を実行します。{ print $0 }file2

于 2013-01-02T23:19:40.640 に答える