问题标题不完全准确,但我不确定如何表达它,所以请随意改进标题。
我有一个文件,其中两列代表基因对,如下所示:
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 :(得分: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]
获取scign012208
,p[2]
获取{ {1}}。
然后,我读入文件scigt009306
并将表达式保存在数组expressions.txt
中,因此e[]
获取e[scign012208]
,依此类推。
然后,最后,我按顺序查看scign012208 92.2080327275079 134.028976718368 161.049844993173
的元素,并从p[]
中选取匹配的内容。
哦,对不起,我刚看到我应该用e[]
来做这件事,你可以这么做 - 但如果grep
是一个大文件,它会很慢:
expressions.txt