2012-04-10 76 views
1

我有一個pattern.txt文件,該文件是這樣的:其中有這樣的線跨多個文件匹配模式:perl或grep?

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

我想匹配數據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; 

這樣做會佔用整個內存:並顯示內存不足的錯誤信息.. 我知道,這可以用grep來完成。但不知道hw做到這一點。 任何人都可以請讓我知道我怎麼可以使用grep -F做到這一點,而不需要使用整個內存?

謝謝。

回答

2

pattern.txt是否適合內存?

如果是這樣,您可以使用像grep -F -f pattern.txt data.txt這樣的命令將data.txt中的行與模式匹配。儘管如此,你將得到完整的一行,並且需要額外的處理才能獲得第二列數字。

或者你可以修復Perl腳本。你用完內存的原因是因爲你完全讀取8gb文件到內存,當你可以像grep一樣逐行處理它時。對於8GB文件,你應該使用這樣的代碼:

open FH, "<", "data.txt"; 
while ($line = <FH>) { 
    # check $line against list of patterns ... 
} 
+0

是。 pattern.txt只是一個276kb的文件。 – ana 2012-04-10 08:44:57

0

嘗試這個

grep "`more pattern.txt`" data.txt | awk -F' ' '{ print $1 " " $2 " " $4}'