2015-09-28 90 views
0

我有多个文件,我需要将它合并为第二个列(从所有其他文件)添加到第一个文件的单个文件。 我的文件看起来像这样,将其他文件的列合并到一个文件中

     Nur of input reads | 33 
        Ave input read length | 20 
           UNIQUE READS: 
           Uni number | 25 
           Uni reads % | 74.40% 

和所有其他文件具有相同的格式,上面我想对第一个文件添加来自所有其他文件的第二列,并使其作为一个文件如下,

   sample_1 sample_2 ..... sample_n 
    Number  340  570  490 
    Average  201  201  201 
    niquely number 27096  29788 39870 
     %   79.60% 80.1%  70 %  

我在UNIX尝试作为

`paste file_1 file_2 ....file_n` 

但导致文件看起来笨拙也没有标头添加到它的文件名。在Perl或Python的任何解决方案表示赞赏.. 谢谢

回答

1

Python的大熊猫解决方案

主要是功能read_csv

df1 = pd.read_csv(files, names=column, sep='|', header=None, usecols=[1]) 

设置namecolumn(从变量列表)不读取第一行作为标题(header=None)和只读第二列(usecols=[1])。分隔符是'|'

第三行的值是NaN,所以它被df1 = df1.dropna()删除。 然后df1被追加到df,最后是从列表到输出df的设置索引。

import pandas as pd 
import glob 

idx = ['Number', 'Average', 'niquely number', '%'] 
df = pd.DataFrame() 
i = 0 

for files in glob.glob('dir/*.txt'): 

    i = i + 1 
    column = ['sample_' + str(i)] 

    df1 = pd.read_csv(files, names=column, sep='|', header=None, usecols=[1]) 
    #print df1 
    #remove NaN value from df1 
    df1 = df1.dropna() 
    #concat df1 to df 
    df = pd.concat([df, df1], axis=1) 

#add column idx do df 
df['idx'] = pd.Series(idx, index=df.index) 
#set index from column idx 
df = df.set_index('idx') 
#remove index name 
del df.index.name 

print df 

输出:

    sample_1 sample_2 
Number    330   30 
Average    201  201 
niquely number   25   44 
%     74.40%  54.40% 

文件1.txt的

Nur of input reads | 330 
        Ave input read length | 201 
           UNIQUE READS: 
           Uni number | 25 
           Uni reads % | 74.40% 

FILE2.TXT

Nur of input reads | 30 
        Ave input read length | 201 
        UNIQUE READS: 
           Uni number | 44 
           Uni reads % | 54.40% 
1

在Perl中,或许是这样的:

#!/usr/bin/perl 
use strict; 
use warnings; 

my %data; 
my @headers = ("Number", "Average", "niquely number", "%"); 

#iterate files called "sample_*.txt" 
foreach my $filename (glob "sample_*.txt") { 
    #open them for reading 
    open(my $input, '<', $filename) or die $!; 

    my %stuff; 
    while (<$input>) { 
     chomp; # strip trailing linefeeds 
     #split on "|" 
     my ($key, $value) = split '\|'; 
     #strip leading/trailing whitespace from the key. 
     $key =~ s/^\s*//g; 
     $key =~ s/\s*$//g; 

     #insert into hash (does this need some whitespace cleaning too?) 
     $stuff{$key} = $value; 
    } 
    close($filename); 

    #insert into hash of hashes 
    $data{$filename} = \%stuff; 
} 

my @file_order = sort keys %data; 
print join("\t", "", @file_order), "\n"; 
foreach my $key (@headers) { 
    print join("\t", $key, map { $_->{$key} } @data{@file_order}), "\n"; 
} 
+0

您好感谢您的剧本,但我只是修改了一下我上面的问题中的示例文件,因为这个脚本正在抛出一个错误,在连接或字符串中使用未初始化的值在script.pl行34 – user1017373

+0

是的。您已更改数据,因此写入的脚本不起作用。这是相当正常的情况。我相信你可以将脚本作为如何打开和处理文件的起点。 – Sobrique

相关问题