2013-03-02 58 views
3

我知道的egrep有安定的一個非常有用的方法兩個表達式一起使用:egrep的AND運算

egrep "pattern1.*pattern2"|egrep "pattern2.*pattern1" filename.txt|wc -l 

不過是有搜索三個表達式時作爲排列成倍增加使用egrep的年代和操作的簡便方法因爲你添加額外的表達式。

我知道另一種方式去使用sort|uniq -d但是我正在尋找一個更簡單的解決方案。

編輯:

我目前的搜索方式將產生總計5個結果:

#!/bin/bash 
pid=$$ 
grep -i "angio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.1.tmp 
grep -i "cardio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.2.tmp 
grep -i "pulmonary" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.3.tmp 
cat /tmp/$pid.1.tmp /tmp/$pid.2.tmp|sort|uniq -d > /tmp/$pid.4.tmp 
cat /tmp/$pid.4.tmp /tmp/$pid.3.tmp|sort|uniq -d > /tmp/$pid.5.tmp 
egrep -o "^[0-9]+ [0-9]+ " /tmp/$pid.5.tmp|getDoc.mps > /tmp/$pid.6.tmp 
head -10 /tmp/$pid.6.tmp 

[email protected]:~/Medline2012$ AngioAndCardioAndPulmonary.script 
1514 Structural composition of central pulmonary arteries. Growth potential after surgical shunts. 
1517 Patterns of pulmonary arterial anatomy and blood supply in complex congenital heart disease 
with pulmonary atresia 
3034 Controlled reperfusion following regional ischemia. 
3481 Anaesthetic management for oophorectomy in pulmonary lymphangiomyomatosis. 
3547 A comparison of methods for limiting myocardial infarct expansion during acute reperfusion-- 
primary role of unload 

雖然:

[email protected]:~/Medline2012$ grep "angio" rtrans.txt|grep "cardio" rtrans.txt|grep "pulmonary" rtrans.txt|wc -l 
185 

產生185行的文本,因爲它只是採取的值在肺部搜索而不是全部三個搜索。

+0

什麼是一個'sort'有一個'grep'辦?我真的沒有得到這個。 – Rubens 2013-03-02 17:28:55

+0

你的例子應該讀'egrep「pattern1。* pattern2 | pattern2。* pattern1」文件名。txt' – 2013-03-02 18:07:55

回答

8

怎麼樣

grep "pattern1" file|grep "pattern2"|grep "pattern3" 

這會給那些包含P1,P2和P3線。但以任意的順序。

+0

然而,這將重疊模式1,模式2和模式3給每個行多個重複的結果。 – Bob 2013-03-02 18:32:55

+0

@BobDunakey我沒有得到你。你可以粘貼一些示例輸入和預期輸出。這樣我就可以知道你想得到什麼? – Kent 2013-03-02 19:58:08

+0

在原始文章中添加了示例搜索。 – Bob 2013-03-02 20:23:52

0

肯特與

grep "pattern1" file|grep "pattern2"|grep "pattern3" 

的方法是正確的,它應該是更快,僅僅是爲了記錄我想後,它使用egrep做同樣的選擇對象不一舉超越:

egrep "pattern1.*pattern2|pattern2.*pattern1" 

它尋找p1 followed by p2p2 followed by p1

0

最初的問題是關於爲什麼他的egrep命令不起作用。

egrep "pattern1.*pattern2"|egrep "pattern2.*pattern1" filename.txt|wc -l 

Kent和Stanislav在指出filename.txt的語法錯誤時是正確的。但是這並沒有解決原來的問題。

鮑勃的「當前的方式」(4年前)是一個多命令的方法來清除不同行上的不同關鍵字。換句話說,他的腳本正在尋找一組包含任意他的搜索條件的行。其他提出的解決方案只會導致其搜索字詞中包含全部的行,這似乎不是他的意圖。

相反,他可能會使用一個線的egrep尋找任何條款,像這樣:

egrep -e 'pattern1|pattern2' filename.txt