2015-09-28 1 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]) 

name до column (список из переменной), не читает первую строку как заголовок (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

Смежные вопросы