2014-05-09 39 views
-1

我有一些文件包含以下數據。基於列提取行

160-68 160 68 B-A OD-CA 3.80247 
160-68 160 68 B-A OG-C 3.73454 
160-69 160 69 B-A OD1-NZ 2.76641 
160-69 160 69 B-A OG-CA 3.54446 
160-69 160 69 B-A OE-NZ2 4.24609 
160-69 160 69 B-A OG-O 3.97644 
160-69 160 69 B-A OG-H 1.82292 

我需要提取具有任何下列對OD-NZ,NZ-OD,OE-NZ,NZ-OE,OE-NH,NH-OE在第五列的行。什麼是簡單的方法來做到這一點?

所需的輸出

160-69 160 69 B-A OD1-NZ 2.76641 
160-69 160 69 B-A OE-NZ2 4.24609 
+1

歡迎的StackOverflow!請參考這個幫助如何在這裏提問:http://stackoverflow.com/questions/how-to-ask - 也要記住以下幾點:你有什麼嘗試?向我們展示您的代碼,然後我們將處於更好的位置幫助您。 – ochi

+0

這些對在他們之後有數字嗎?多少? – Ashkan

回答

4
awk '$5 ~ /OD[0-9]*-NZ[0-9]*|NZ[0-9]*-OD[0-9]*|OE[0-9]*-NZ[0-9]*|NZ[0-9]*-OE[0-9]*|OE[0-9]*-NH[0-9]*|NH[0-9]*-OE[0-9]*/' input.txt 
1
grep -P 'OD\d?-NZ\d?|NZ\d?-OD\d?|....' file 

如果你喜歡用awk,得到$5並用相同的正則表達式查詢。

+0

YMMV用awk中的'\ d' ... –

+0

@EdMorton我只想保存一些輸入.... :-('\ d - > [0-9]' – Kent

+0

ITYM'\ d - > [[:數字:]]':-)。我得到你來自哪裏,我只是不認爲'\ d'會適用於大多數awk,因爲你說'相同的正則表達式'... –

4

如果您需要添加/刪除/修改您將來感興趣的任何配對,這可能是最容易的。使用GNU awk for gensub():

awk -v pairs="OD-NZ NZ-OD OE-NZ NZ-OE OE-NH NH-OE" ' 
    BEGIN{ split(pairs, tmp); for (i in tmp) pairsArr[tmp[i]] } 
    gensub(/[[:digit:]]/,"","g",$5) in pairsArr 
' file 
160-69 160 69 B-A OD1-NZ 2.76641 
160-69 160 69 B-A OE-NZ2 4.24609 

您可以在任何awk中使用gsub()和變量。

或者如果你喜歡:

awk -v pairs="OD-NZ|NZ-OD|OE-NZ|NZ-OE|OE-NH|NH-OE" ' 
BEGIN { pairs = "^" gensub(/([-|]|$)/,"[[:digit:]]*\\1","g",pairs) "$" } 
$5 ~ pairs 
' file 
160-69 160 69 B-A OD1-NZ 2.76641 
160-69 160 69 B-A OE-NZ2 4.24609