2014-11-04 62 views
0

问题标题抽取线不完全准确,但我不知道如何句话就那么请随时提高的称号。grep的 - 从一个文件基础上的模式在另一个文件

我有一个文件具有两列表示基因对,像这样:

scign012208 scigt009306 
scign019190 scigt021712 
scign000207 scigt021506 
scign011139 scigt008461 
scign018733 scigt003814 

我有一个包含在一行中的每个基因的表达信息的另一文件中,但以不同的顺序比所述对以上:

scign012208 92.2080327275079 134.028976718368 161.049844993173 
scigt021506 271.448068344812 244.144367035135 352.78889225294 
scign011139 0 0 1.22007458328161 
scigt021712 69.3835869760283 70.7270589739666 65.015475611569 
scigt009306 91.2941933895109 159.815950566175 221.69211356076 
scign018733 1.35600048128688 0 0 
scigt021506 271.448068344812 244.144367035135 352.78889225294 
scign019190 1.35600048128688 5.86988219204531 3.66022374984483 

我想提取匹配上述基因名称线和保持在单独的行,两对彼此跟随,这样的:

scign012208 92.2080327275079 134.028976718368 161.049844993173 
scigt009306 91.2941933895109 159.815950566175 221.69211356076 
scign019190 1.35600048128688 5.86988219204531 3.66022374984483 
scigt021712 69.3835869760283 70.7270589739666 65.015475611569 

我试着用grep -E并把“|”第一个文件中的两列之间,但如何保持正确的顺序?

+0

你的意思是“正确的顺序?你的意思是,从第一个文件中对需要在输出(即使它们可能不是在输入顺序线)?被整理为连续线 – 2014-11-04 21:16:24

+0

请出示 – Barmar 2014-11-04 21:17:06

+0

谢谢,我试图展示想要的结果 – Jon 2014-11-04 21:19:12

回答

1

这其实是相当简单与xargs

cat file1 | xargs -n 1 -I % grep % file2 

这里的关键是xargs -n 1。它将xargs限制为一次只读取一个单词,而不是逐行读取文件。

+0

这很美丽。 – Jon 2014-11-05 07:10:39

0

我不明白你的问题,但怀疑这是接近的答案!

awk 'FNR==NR{p[++i]=$1;p[++i]=$2;next} {e[$1]=$0} END{for(j=1;j<=i;j++)print e[p[j]]}' pairs.txt expressions.txt 

好吧,我的文件pairs.txt中读取并保存在一个数组p[]在那里的项目,所以p[1]得到scign012208p[2]得到scigt009306

然后,我在文件中expressions.txt读取并保存在阵列e[]表达,所以e[scign012208]得到scign012208 92.2080327275079 134.028976718368 161.049844993173等。

然后,最后,我按顺序通过p[]的元素,并从e[]拿起匹配的东西。

哦,对不起,我刚才看到我应该用grep做到这一点,你可以做到这一点,我想 - 但它会很慢,如果expressions.txt是一个很大的文件:

while read a b; do grep "$a" expressions.txt; grep "$b" expressions.txt; done < pairs.txt 
相关问题