我是编程世界的新手,所以如果我刚问了一个简单明了的问题,请原谅我。我真的需要很多帮助。
我目前有两组数据。
第一个看起来像这样(称之为file1):
GeneName
TAF13
ZC3H6
RAC3
MED16
FAT3
SCRG1
GRM3
DHX16
LRRN4CL
STMN4
PCDHGA11
RPLP1
WASF1
KATNAL1
FTL1
D8ERTD738E
第二个看起来像这样(称之为“file2”):
GeneName Chr Start End SumOfMerge 67_1 67_2 67_3 68_1 68_2 68_3 69_1 69_2 69_3 70_1 70_2 70_3 71_1 71_2 71_3 72_1 72_2 72_3 73_1 73_2 73_3
LOC100288069 chr1 713126 714875 13 NA nPk1 nPk1 NA nPk1 nPk1 NA NA nPk1 NA nPk2 nPk1 NA nPk1 nPk1 NA nPk1 nPk1 NA nPk1 nPk1
FAM87B chr1 752176 752900 20 nPk2 nPk3 nPk2 nPk2 nPk3 nPk3 nPk2 nPk3 nPk3 nPk2 nPk4 NA nPk3 nPk3 nPk3 nPk3 nPk3 nPk2 nPk2 nPk3 nPk3
LINC00115 chr1 761026 763300 20 nPk7 nPk6 nPk3 nPk7 nPk5 nPk4 nPk7 nPk8 nPk5 NA nPk5 nPk3 nPk8 nPk6 nPk4 nPk7 nPk7 nPk3 nPk8 nPk7 nPk4
SAMD11 chr1 858401 862175 20 nPk16 NA nPk10 nPk16 nPk13 nPk13|nPk14 nPk16 nPk16 nPk13 nPk14 nPk13 NA nPk18 nPk13 nPk11|nPk12 nPk17 NA nPk12 nPk17 nPk16 nPk11
KLHL17|NOC2L chr1 892751 897375 21 nPk23 nPk14 nPk15 nPk24|nPk25 NA nPk18 nPk25 nPk20 nPk18 nPk24 nPk18 nPk10 nPk27|nPk28 nPk17 NA nPk25 nPk18 nPk18 nPk24 nPk20 nPk16
HES4 chr1 934201 937725 14 nPk30 nPk19 nPk19 NA nPk24 nPk22 nPk33 nPk25 nPk22 NA NA NA NA NA nPk23 nPk32 nPk23 nPk22 NA nPk25 nPk20
ISG15 chr1 948076 948750 7 nPk32 NA NA nPk33 NA NA nPk36 NA NA nPk35 NA NA nPk37 NA NA nPk34 NA NA nPk36 NA NA
AGRN chr1 954376 954875 21 nPk34 nPk22 nPk21 nPk36 nPk27 nPk24 nPk38 nPk28 nPk24 nPk37 nPk24 nPk16 nPk39 nPk24 nPk25 nPk36 nPk26 nPk24 nPk38 nPk28 nPk22
AGRN chr1 954951 955275 11 NA NA nPk22 NA nPk28 nPk25 NA nPk29 nPk25 NA nPk25 nPk17 NA NA nPk26 NA nPk27 nPk25 NA NA nPk23
C1orf159 chr1 1051051 1052500 21 nPk53 nPk38 nPk37 nPk56 nPk42 nPk39 nPk60 nPk42 nPk41 nPk54 nPk38 nPk25 nPk55 nPk40 nPk40 nPk57 nPk45 nPk38 nPk55 nPk50 nPk38
LINC01342 chr1 1070301 1073175 2 NA NA NA NA NA NA NA NA NA NA nPk40 nPk28 NA NA NA NA NA NA NA NA NA
TTLL10 chr1 1108776 1109450 1 NA NA NA NA NA NA NA NA NA nPk65 Na NA NA NA NA NA NA NA NA NA NA
TNFRSF4 chr1 1150276 1150750 2 NA NA NA NA NA NA NA NA NA nPk72 NA NA nPk72 NA NA NA NA NA NA NA NA
SDF4 chr1 1165926 1167475 4 NA NA NA NA NA nPk48 NA NA NA NA NA NA NA NA nPk50 NA NA nPk45 NA NA nPk46
请原谅我,如果第二个数据真的很乱,它实际上是一个包含26个列的数据,每个数据以制表符空格分隔。
我的目标是通过第一列“GeneName”比较file1和file2,并将file2中的行提取到新文件file3。
file3应该看起来像file2,除了只包含与file1具有相同GeneName的行。
目前,我已尝试使用comm
和join
以及grep -f
,但没有人提供我想要的解决方案。我认为grep
可能足以完成这项工作,但我不知道正确的选择。如果此问题还有其他可能的解决方案,请与我分享。谢谢你的时间!
答案 0 :(得分:2)
Grep + bash:
grep -f <(tail -n +2 file1 | sed 's/^/^/g') file2 > file3
这将删除GeneName
列(使用tail -n +2
跳过第一行 - 从第二行开始打印)并将^
(行首的regexp)添加到每个列的开头line - 这样的列表是grep -f
匹配行并将它们写入file3的好列表。
这假设您不希望输出中的标题(GeneName)行。
答案 1 :(得分:1)
你对一个小的python代码有什么看法?
#!/usr/bin/python
import sys, re
lookup = {}
for line in open( sys.argv[1] ).readlines():
lookup[line.rstrip()] = True
for line in open( sys.argv[2] ).readlines():
s = re.split('[\t ]+', line)
if len(s) > 0 and s[0] in lookup:
print( line.rstrip() )
如果文件保存为py.py,则:
chmod 755 py.py
./py.py file1 file2 > file3
此时您可能想稍微调整一下文件以区分大小写?将.lower()添加到查找键和s [0]。