grep的 - 从一个文件基础上的模式在另一个文件
问题标题抽取线不完全准确,但我不知道如何句话就那么请随时提高的称号。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并把“|”第一个文件中的两列之间,但如何保持正确的顺序?
这其实是相当简单与xargs
。
cat file1 | xargs -n 1 -I % grep % file2
这里的关键是xargs -n 1
。它将xargs
限制为一次只读取一个单词,而不是逐行读取文件。
这很美丽。 – Jon 2014-11-05 07:10:39
我不明白你的问题,但怀疑这是接近的答案!
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]
得到scign012208
,p[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
你的意思是“正确的顺序?你的意思是,从第一个文件中对需要在输出(即使它们可能不是在输入顺序线)?被整理为连续线 – 2014-11-04 21:16:24
请出示 – Barmar 2014-11-04 21:17:06
谢谢,我试图展示想要的结果 – Jon 2014-11-04 21:19:12