2015-09-28 87 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

相關問題