Grep - 根据另一个文件中的模式从文件中提取行

时间:2014-11-04 21:15:15

标签: unix grep extract

问题标题不完全准确,但我不确定如何表达它,所以请随意改进标题。

我有一个文件,其中两列代表基因对,如下所示:

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并输入“|”在第一个文件中的两列之间,但如何保持正确的顺序?

2 个答案:

答案 0 :(得分:1)

xargs实际上非常简单。

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

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

答案 1 :(得分: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]获取{ {1}}。

然后,我读入文件scigt009306并将表达式保存在数组expressions.txt中,因此e[]获取e[scign012208],依此类推。

然后,最后,我按顺序查看scign012208 92.2080327275079 134.028976718368 161.049844993173的元素,并从p[]中选取匹配的内容。

哦,对不起,我刚看到我应该用e[]来做这件事,你可以这么做 - 但如果grep是一个大文件,它会很慢:

expressions.txt
相关问题