2012-12-20 46 views
5

我有一個關於模式匹配的問題。 我有在它的多個圖案的文件,說pattern.txtgrep從一個文件的多個模式,並輸出每個模式的前5個匹配

Locus3039v1rpkm6.85
Locus3041v1rpkm6.84
Locus3042v1rpkm6.84

而且測試文件搜索是file.txt的 -

Locus3039v1rpkm6.85 gi|350401309|ref|XM_003486067.1| 0 10 85 328 253 8e-12 78.8 
Locus3039v1rpkm6.85 gi|350401301|ref|XM_003486066.1| 0 10 85 566 491 8e-12 78.8 
Locus3039v1rpkm6.85 gi|350401298|ref|XM_003486065.1| 0 10 85 500 425 8e-12 78.8 
Locus3039v1rpkm6.85 gi|340723355|ref|XM_003400008.1| 0 10 106 566 470 3e-11 77.0 
Locus3039v1rpkm6.85 gi|340723353|ref|XM_003400007.1| 0 10 106 496 400 3e-11 77.0 
Locus3039v1rpkm6.85 gi|359323056|ref|XM_003639939.1| 0 27 104 322 245 9e-05 55.4 
Locus3039v1rpkm6.85 gi|359323055|ref|XM_543849.4| 0 27 104 241 164 9e-05 55.4 
Locus3039v1rpkm6.85 gi|354503991|ref|XM_003514015.1| 0 27 103 335 259 0.004 50.0 
Locus3039v1rpkm6.85 gi|341599927|emb|AM412059.2| 1 63 100 1645525 1645489 6.8 39.2 
Locus3039v1rpkm6.85 gi|340003223|emb|HE572590.1| 1 63 100 1671652 1671616 6.8 39.2 
Locus3041v1rpkm6.84 gi|337757426|emb|FQ859181.1| 1 61 114 2772617 2772667 0.60 42.8 
Locus3041v1rpkm6.84 gi|159889572|gb|CP000875.1|  0 5 40 1185295 1185330 0.60 42.8 
Locus3041v1rpkm6.84 gi|158107272|gb|CP000820.1|  0 2 34 5594193 5594161 0.60 42.8 
Locus3041v1rpkm6.84 gi|156844486|ref|XM_001645256.1| 83 140 793 850 0.60 42.8 
Locus3041v1rpkm6.84 gi|339305108|gb|CP001503.2|  0 58 94 3006529 3006565 2.1 41.0 
Locus3041v1rpkm6.84 gi|247533203|gb|CP001607.1|  0 1 40 1268073 1268034 2.1 41.0 
Locus3041v1rpkm6.84 gi|367050653|ref|XM_003655658.1| 0 75 103 843 871 7.3 39.2 
Locus3041v1rpkm6.84 gi|347002178|gb|CP003012.1|  0 75 103 2986236 2986208 7.3 39.2 
Locus3043v1rpkm6.84 gi|332015867|gb|HQ658110.1|  0 9 31 4151 4129 0.49 42.8 
Locus3043v1rpkm6.84 gi|254946573|gb|CP001619.1|  1 9 43 4243052 4243019 0.49 42.8 
Locus3043v1rpkm6.84 gi|329755665|gb|JF715057.1|  0 11 42 110968 110937 1.7 41.0 
Locus3043v1rpkm6.84 gi|9937515|gb|AF294752.1| 0 48 79 2081 2050 1.7 41.0 

我想匹配前5個匹配的每個模式,並移動到前五個模式的下一個模式,依此類推。

我試圖

grep -i -m 5 -f pattern.txt file.txt > out.txt 
grep -i -f pattern.txt -m 5 file.txt > out.txt 

但我只獲得前5名的第一圖案和結束。我哪裏錯了?是否有一個參數來執行這個所需的功能?

回答

4

試試這個:

for pat in $(cat pattern.txt); do grep -i -m 5 $pat file.txt; done > out.txt 

意思是

  1. 對於pattern.txt中的每個模式,grep前5匹配記錄。
  2. 追加結果到out.txt

編輯

由於@dogbane在他的評論中提到的,這是一個UUOC。這裏是我改進的答案:

for pat in $(< pattern.txt); do grep -i -m 5 $pat file.txt; done > out.txt 

也看看this答案。

+3

如果你是把重定向完成後,你可以簡單地使用'>',而不是'>> '... – anishsane

+0

@anishsane謝謝,糾正! –

+2

這是[UUOC](http://partmaps.org/era/unix/award.html)。 – dogbane

2

每次使用>要覆蓋與新的輸出文件,使用>>相反,你就可以追加到文件時間:

$ yourcommand >> file 
1

下面是使用awk的一種方法。它應該是相當快過,因爲file.txt是隻讀一次:

awk 'BEGIN { IGNORECASE=1 } FNR==NR { a[$0]++; next } { for (i in a) if ($0 ~ i && a[i] <= 5) { print; a[i]++ } }' patterns.txt file.txt 

結果:

Locus3039v1rpkm6.85 gi|350401309|ref|XM_003486067.1| 0 10 85 328 253 8e-12 78.8 
Locus3039v1rpkm6.85 gi|350401301|ref|XM_003486066.1| 0 10 85 566 491 8e-12 78.8 
Locus3039v1rpkm6.85 gi|350401298|ref|XM_003486065.1| 0 10 85 500 425 8e-12 78.8 
Locus3039v1rpkm6.85 gi|340723355|ref|XM_003400008.1| 0 10 106 566 470 3e-11 77.0 
Locus3039v1rpkm6.85 gi|340723353|ref|XM_003400007.1| 0 10 106 496 400 3e-11 77.0 
Locus3041v1rpkm6.84 gi|337757426|emb|FQ859181.1| 1 61 114 2772617 2772667 0.60 42.8 
Locus3041v1rpkm6.84 gi|159889572|gb|CP000875.1|  0 5 40 1185295 1185330 0.60 42.8 
Locus3041v1rpkm6.84 gi|158107272|gb|CP000820.1|  0 2 34 5594193 5594161 0.60 42.8 
Locus3041v1rpkm6.84 gi|156844486|ref|XM_001645256.1| 83 140 793 850 0.60 42.8 
Locus3041v1rpkm6.84 gi|339305108|gb|CP001503.2|  0 58 94 3006529 3006565 2.1 41.0 
+0

我使用了awk命令,但出現如下錯誤。我搜索了但無法理解大括號中的問題。------------------------------------- -------------------------------------------------- ------------------ awk:cmd。 line:1:(FILENAME = searchfile.txt FNR = 1)fatal:無與倫比(或(:/Locus1748v1rpkm10.04 10.04 gi | 14089695 | emb | AL445564.1 |肺炎支原體(菌株UAB CTI ... 0 64 89 5112 5087 6.5 – Rohit