2016-02-19 44 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

。 –