从NCBI BLASTp解析表

2024-05-23 21:09:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个两列的文件转换成一个0和1的表,以便准备PCA(主成分分析)。输入文件由第一列中的细菌名称和第二列中的细菌描述符组成。在

可能的方法:将输入文件存储在散列中,然后对每列执行某种uniq命令,并将它们添加到输出文件中。最后,对于输出文件中的每个组合,如果在文件1哈希中找到细菌名称和描述符,则添加0或1。在

输入文件(制表符分隔):

bacteria_1  protein:plasmid:149679
bacteria_1  protein:proph:183386
bacteria_2  protein:proph:183386
bacteria_3  protein:plasmid:147856
bacteria_3  protein:proph:183386

所需输出(制表符分隔):

^{pr2}$

Tags: 文件方法命令名称制表符描述符成分细菌
2条回答

快速python脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import fileinput
from collections import defaultdict

output = defaultdict(list)
proteins = set()

for line in fileinput.input():
    bacteria, protein = line.strip().split()
    proteins.update([protein])
    output[bacteria].append(protein)

# Print header
print ' '*12,
for header in sorted(proteins):
    print '{:25}'.format(header),
print

# Print table
for key in output:
    print '{:12}'.format(key),
    for header in sorted(proteins):
        if header in output[key]:
            print '{:22}'.format(1),
        else:
            print '{:22}'.format(0),
    print

输出:

^{pr2}$

以下是GNU awk的一种方法:

awk '{
    header[$2]++; 
    bacteria[$1]++; 
    map[$1,$2]++
}
END { 
    x=asorti(header,header_s); 
    for(i=1;i<=x;i++) { 
        printf "\t%s\t", header_s[i]   
    }
    print ""
    y=asorti(bacteria,bacteria_s); 
    for(j=1;j<=y;j++) { 
        printf "%s\t\t", bacteria_s[j]; 
        for (z=1;z<=x;z++) {
            printf "%s\t\t\t\t", (map[bacteria_s[j],header_s[z]])?"1":"0"
        } 
    print ""
    } 
}' file
        protein:plasmid:147856          protein:plasmid:149679          protein:proph:183386
bacteria_1              0                               1                               1
bacteria_2              0                               0                               1
bacteria_3              1                               0                               1

下面是一个正则awk的解决方案:

^{pr2}$

相关问题 更多 >