2016-02-19 37 views
2

精確模式的grep行我有這樣的腳本:在第一列

while read line; do grep $line my_annot | awk '{print $2}' ; done < foo.txt 

但它不會返回我想要的。

問題是,在foo.txt中,當我有例如Contig1時,腳本將返回文件my_annot的第2列,即使發現的模式是Contig12而非僅Contig1!

我在$模式結束時嘗試了$,但問題在於它對應於行尾,而我搜索的這個表達式在列1中,因此不是行尾。

我該如何判斷搜索此EXACT模式,而不是那些包含此模式的模式?

#######回答:

我的腳本是:

annot='/home/mu/myannot' 
awk 'NR == FNR { line[$0]; next } $1 in line { print $2 }' $1 $annot > out 

它可以讓我放棄,我想找到的第一個參數表達的名單做./myscript.sh MYLIST

然後我將結果重定向到一個名爲out的文件中。

謝謝你們!

+0

你是否試過在'^'和'$'中包裝正則表達式? – Bohemian

+1

爲什麼不只是'awk'$ 1 ==「Contig1」{print $ 2}'foo.txt'而不是所有的循環和grepping? – JNevill

+1

你不需要'grep -w'或'grep --word-regexp'嗎? – Carcamano

回答

2

你應該用awk做這件事:

awk 'NR == FNR { line[$0]; next } $1 in line { print $2 }' foo.txt my_annot 

這讀取foo.txt每一行,在數組中設置一個關鍵line,然後打印第一列與數組中其中一個鍵完全匹配的任何行的第二列。

當然,我猜測您的數據格式與其他答案相同。

0

所以,你有一個像

Contig1   hugo 
Contig12  paul 

權的文件?

那麼這將幫助:

awk '$1~/^Contig1$/ {print $2}' foo.txt 
+1

或只是'$ 1 ==「Contig1」'。 – fedorqui

+0

是啊......你是對的 - 會更高效一些,而且更加神祕;) – Olli

+0

好的,但是你怎麼結合閱讀線?因爲Contig1是我想要閱讀的文件中的一行。 $ 1 ==「$ line」?? – user236152

0

我覺得這是你想要

while read line; do grep -w $line my_annot | awk '{print $2}' ; done < foo.txt 

什麼,但它不是100%清晰(由於缺乏數據。例如)會否在所有情況下工作。

+0

。 –