Python 基于第一个唯一列值提取表
我有一个表格格式的大文件(2GB),需要根据第二列的第一个值进行grepPython 基于第一个唯一列值提取表,python,shell,awk,Python,Shell,Awk,我有一个表格格式的大文件(2GB),需要根据第二列的第一个值进行grep Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269 Ref1 xzxzxzz00000126626.2 50.20 249 124 0 11 259 2 250 8e-79 248 Ref1 xzxzxzz00000137335.1 49.81 259 130 0 1
Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269
Ref1 xzxzxzz00000126626.2 50.20 249 124 0 11 259 2 250 8e-79 248
Ref1 xzxzxzz00000137335.1 49.81 259 130 0 1 259 125 383 1e-78 252
Ref1 ASNP00000445420.1 49.42 259 131 0 1 259 125 383 3e-78 251
Ref1 xzxzxzz00000126626.2 52.20 349 124 0 11 259 2 250 8e-79 248
Ref1 ASNP00000445420.1 49.80 255 128 0 1 255 125 379 2e-77 249
Ref1 ASNPCAP00000013746.1 47.88 259 135 0 1 259 106 364 1e-76 243
Ref2 xzxzxzz00000108341.3 26.38 163 87 8 11 140 156 318 5e-04 43.9
Ref2 ASNP00000026303.9 26.38 163 87 8 11 140 149 311 5e-04 43.9
Ref2 xzxzxzz00000108321.3 16.38 163 87 8 11 140 156 318 5e-04 43.9
Ref2 ASNP00000108340.1 26.38 163 87 8 11 140 149 311 5e-04 43.9
Ref2 ENSLAFP00000015342.3 25.45 165 86 9 11 140 150 312 0.002 41.6
我需要从第二列中得到第一个唯一的字母表,与第一列值的预期输出类似
Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269
Ref1 ASNP00000445420.1 49.42 259 131 0 1 259 125 383 3e-78 251
Ref1 ASNPCAP00000013746.1 47.88 259 135 0 1 259 106 364 1e-76 243
Ref2 xzxzxzz00000108341.3 26.38 163 87 8 11 140 156 318 5e-04 43.9
Ref2 ASNP00000026303.9 26.38 163 87 8 11 140 149 311 5e-04 43.9
Ref2 ENSLAFP00000015342.3 25.45 165 86 9 11 140 150 312 0.002 41.6
我尝试使用R,但由于大小(可能是系统配置)的原因失败。python或AWK有什么建议吗?请尝试以下内容。我相信这应该会更快,尽管我还没有用大量数据进行测试
awk '
{
val=$2
gsub(/[^a-zA-Z]+/,"",val)
}
!a[$1,val]++{
value=(value?value ORS:"")$0
}
END{
print value
}
' Input_file
输出如下
Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269
Ref1 ASNP00000445420.1 49.42 259 131 0 1 259 125 383 3e-78 251
Ref1 ASNPCAP00000013746.1 47.88 259 135 0 1 259 106 364 1e-76 243
Ref2 xzxzxzz00000108341.3 26.38 163 87 8 11 140 156 318 5e-04 43.9
Ref2 ASNP00000026303.9 26.38 163 87 8 11 140 149 311 5e-04 43.9
Ref2 ENSLAFP00000015342.3 25.45 165 86 9 11 140 150 312 0.002 41.6
Python版本,使用
re
模块和itertools.groupby
如果您的问题输入了data.txt
,则此脚本:
import re
from itertools import groupby
with open('data.txt', 'r') as f_in:
for v, g in groupby(f_in, lambda k: k.split()[0]):
seen = set()
for line in g:
alpha = re.findall(r'^[a-zA-Z]+', line.split()[1])[0]
if alpha not in seen:
seen.add(alpha)
print(line.strip())
产生:
Ref1 xzxzxzz00000135960.1 51.74 259 125 0 1 259 125 383 3e-85 269
Ref1 ASNP00000445420.1 49.42 259 131 0 1 259 125 383 3e-78 251
Ref1 ASNPCAP00000013746.1 47.88 259 135 0 1 259 106 364 1e-76 243
Ref2 xzxzxzz00000108341.3 26.38 163 87 8 11 140 156 318 5e-04 43.9
Ref2 ASNP00000026303.9 26.38 163 87 8 11 140 149 311 5e-04 43.9
Ref2 ENSLAFP00000015342.3 25.45 165 86 9 11 140 150 312 0.002 41.6
因此,我们鼓励人们在他们的帖子中添加他们的努力,所以请添加同样的努力,然后让我们知道。我尝试使用awk命令'FNR==1{print;next}!a[substr($2,1,6)]++'但它失败了。好的,请在你的帖子中添加该代码。你能解释一下获得预期产出的逻辑吗?就像为什么
xzxzxzz00000126626.2
不在输出中,至少它的1个条目应该在那里,对吗?想法是从第二列中获取第一个唯一字母,关于第一列值,请描述清楚关系,因为不清楚您到底想要什么