2016-08-02 3 views
1

私はtargets.txtとhuge.txtの2つのファイルを持っています。 Huge.txtは、タブ区切りのファイルで、50mの行とすべての数字です。 Targets.txtには、huge.txtで検索したい特定の列のみの100,000個の値(すべての数値)のリストが含まれています。私は、任意の列と一致する場合、私は私が興味を持って上以外の列の数が一致している場合がありますので、私は偽陽性を取得しますgrep複数の値ですが、特定の列のみ

を私のようなものを使用することができます。私はしません

awk '$3==someval' huge.txt 

をtargets.txtのサイズを指定してforループを実行し、出力ファイルに>>を何回か実行する必要があります.O(n^2)です。 grep -Fを使う方法はありますか?grepには、例えば3列目しか見せないように指示しますか?

出力では、huge.txtの完全な行が必要です。

答えて

1

awkの慣用方法では、小さなファイルを配列に格納し、大きなファイルを参照しています。例えば

ので、あなたは、チャンクにこれらの実行複数のTarget.txtを分割し、結果をマージすることができた場合、

awk -F'\t' 'NR==FNR{a[$1]; next} $3 in a' Target.txt Huge.txt 

100kの番号は、あなたの記憶のために大きいかもしれません。現代のコンピュータにとっては、それは問題ではありません。

+0

興味深いことに、これは最後の列を除いてhuge.txtのすべての列で機能します。私が何をしても、列$ NFの値の照合は拒否されます。だから私がすれば: awk -F '\ t "NR == FNR {a [$ 1];次の} $ NRの 'target.txt huge.txt は一度も一致しません。しかし、$ NRを$ 1から$ N-1にN列で置き換えると、そのコードはうまく動作します。 – ben

+0

'NR'は行番号です。最後のフィールドは' $ NF'です。 – karakfa

+0

ありがとうございます。何らかの理由で私はまだそれを最後の行で動作させることができません – ben

関連する問題