1

次のような pattern.txt ファイルがあります。

2gqt+FAD+A+601   2i0z+FAD+A+501
1n1e+NDE+A+400   2qzl+IXS+A+449
1llf+F23+A+800   1y0g+8PP+A+320
1ewf+PC1+A+577   2a94+AP0+A+336
2ydx+TXP+E+1339   3g8i+RO7+A+1
1gvh+HEM+A+1398   1v9y+HEM+A+1140
2i0z+FAD+A+501   3m2r+F43+A+1
1h6d+NDP+A+500   3rt4+LP5+C+501
1w07+FAD+A+1660   2pgn+FAD+A+612
2qd1+PP9+A+701   3gsi+FAD+A+902

このような行を持つデータ(サイズは約8GB)と呼ばれる別のファイルがあります。

2gqt+FAD+A+601   2i0z+FAD+A+501    0.874585  0.785412
1n1e+NDE+A+400   2qzl+IXS+A+449    0.145278  0.589452
1llf+F23+A+800   1y0g+8PP+A+320    0.784512  0.341786
1ewf+PC1+A+577   2a94+AP0+A+336    0.362542  0.784785
2ydx+TXP+E+1339   3g8i+RO7+A+1     0.251452  0.365298
1gvh+HEM+A+1398   1v9y+HEM+A+1140  0.784521  0.625893
2i0z+FAD+A+501   3m2r+F43+A+1      0.369856  0.354842
1h6d+NDP+A+500   3rt4+LP5+C+501    0.925478  0.365895
1w07+FAD+A+1660   2pgn+FAD+A+612   0.584785  0.325863
2qd1+PP9+A+701   3gsi+FAD+A+902    0.874526  0.125453

ただし、データ ファイルは上記のように単純ではありません。ファイルのサイズが大きいのは、各行の最初の列で文字列を開始する約 18000 行があるためです。つまり、2gqt+FAD+A+601 で始まる 18000 行と、1n1e+NDE+A+400 で始まる 18000 行が続きます。ただし、pattern.txt のように、指定されたパターンに一致する行は 1 つだけです。

pattern.txt の行をデータと一致させようとしていて、印刷したい:

2gqt+FAD+A+601   2i0z+FAD+A+501 0.785412
1n1e+NDE+A+400   2qzl+IXS+A+449 0.589452
1llf+F23+A+800   1y0g+8PP+A+320 0.341786
1ewf+PC1+A+577   2a94+AP0+A+336 0.784785  
2ydx+TXP+E+1339   3g8i+RO7+A+1  0.365298
1gvh+HEM+A+1398   1v9y+HEM+A+114 0 0.625893
2i0z+FAD+A+501   3m2r+F43+A+1 0.354842
1h6d+NDP+A+500   3rt4+LP5+C+501 0.365895
1w07+FAD+A+1660   2pgn+FAD+A+612 0.325863
2qd1+PP9+A+701   3gsi+FAD+A+902 0.125453

今のところ、私は次のようにperlで何かを使用しています:

use warnings;
open AS, "combi_output_2_fixed.txt";
open AQ, "NAMES.txt";
@arr=<AS>;
@arr1=<AQ>;
foreach $line(@arr)
{
    @split=split(' ',$line);
    foreach $line1(@arr1)
    {
     @split1=split(' ',$line1);
     if($split[0] eq $split1[0] && $split[1] eq $split1[1])
     { print $split1[0],"\t",$split1[1],"\t",$split1[3],"\n";}
   }

}
close AQ;
close AS;

これを行うとメモリ全体が使い果たされ、Out of memory エラー メッセージが表示されます。これは grep を使用して実行できることを認識しています。しかし、それを行う方法がわかりません。grep -F を使用して、メモリ全体を使い果たすことなくこれを行う方法を教えてください。

ありがとう。

4

2 に答える 2

2

pattern.txtメモリに収まりますか?

その場合、次のようなコマンドを使用してgrep -F -f pattern.txt data.txt、data.txt の行をパターンと照合できます。ただし、行全体を取得し、2 番目の列の数値のみを取得するには追加の処理が必要になります。

または、Perl スクリプトを修正することもできます。メモリ不足の理由は、grep のように 1 行ずつ処理できる場合に、8 GB のファイルを完全にメモリに読み込むためです。8GB ファイルの場合、次のようなコードを使用する必要があります。

open FH, "<", "data.txt";
while ($line = <FH>) { 
    # check $line against list of patterns ...
}
于 2012-04-10T07:50:31.300 に答える
0

これを試して

grep "`more pattern.txt`" data.txt | awk -F' ' '{ print $1 " "  $2 " " $4}'
于 2012-04-10T07:50:58.430 に答える