我有12个.csv文件,其中包含获取的分类名称及其频率(每个名称被获取的次数)。我已经创建了一个主.txt文件,列出了至少在这12个文件中找到的所有唯一分类单元。我需要制作一个csv格式的连接表,其中行的头是每个文件的名称,列的头都是主.txt文件中列出的唯一分类法。该表必须填充每个.csv输入文件中每个分类法旁边的频率。虽然主列表包含12个文件中可能包含的所有分类法,但并非所有文件都包含所有分类法。当分类单元丢失时,我需要放一个'0‘。
.csv输入:
$cat file_1
1,Salmo salar
12,Solanum pennellii
18,Staphylococcus xylosus
...
$cat file_2
1,Salmo salar
14,Staphylococcus xylosus
123,Strongyloides stercoralis
...
$cat file_3
123,Solanum pennellii
11,Staphylococcus xylosus
41,Strongyloides stercoralis
....txt主列表:
$cat master
Salmo salar
Solanum pennellii
Staphylococcus xylosus
Strongyloides stercoralis
....csv输出(我需要的):
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
File_1,1,12,18,0
File_2,1,0,14,123
File_3,0,123,11,41 我以前尝试过制作一个没有主列表的小python脚本,并使用包含重复类群名称的.tsv输入文件,而不是频率。我无法获得一个显示每个文件缺少分类法的表,所以我决定创建一个主列表并折叠输入文件。我在python是个新手,所以任何帮助都会很感激。
发布于 2016-05-09 06:21:00
对于即将到来的awk,我们向您致敬!
awk是为这样的处理创建的。
试一试:
awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}'测试:
$ awk -F "," -v OFS="," '
FNR==1 {samples[++fni]=FILENAME}
{if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1}
END {
printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n")
for (i=1; i<=fni; i++) {
printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n")
}
}' file_*
Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis
file_1,1,12,18,0
file_2,1,0,14,123
file_3,0,123,11,41发布于 2016-05-09 05:21:12
你根本不需要主文件。我只需要动态地生成最后一个表。假设将输入文件名作为命令行参数传递给Python脚本:
import sys
from collections import defaultdict
data = defaultdict(dict) # { taxon: { filename: count } }
for filename in sys.argv[1:]:
with open(filename) as infile:
for line in infile:
count, taxon = line.rstrip().split(',')
data[taxon][filename] = count现在您有了data,它是输出文件所需的一切。然后,您可以这样打印它:
taxa = data.keys()
print "Sample,{}".format(','.join(taxa))
for filename in sys.argv[1:]:
print filename,
for taxon in taxa:
count = data[taxon].get(filename, "0")
sys.stdout.write("," + count)
print发布于 2016-05-09 05:23:17
尝试使用csv.Dictwriter.
https://stackoverflow.com/questions/37107464
复制相似问题