2015-07-06 4 views
-3

У меня есть 100 файлов, которые я хочу объединить на основе mir_seq в файлах. Выходом должен быть один файл, который содержит mir_seq и столбец freq из исходных файлов.Объединить файлы на основе столбцов

файлы выглядеть следующим образом:

file1:

mir_seq         seq      name     freq mir start end mism add t5 t3 s5 s3 DB ambiguity 
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT TGAGAAGAAGCACTGTAGCTCTT seq_100006_x0  0 hsa-miR-143-3p 61 81 6AT u-TT 0 0 AGTCTGAG GCTCAGGA miRNA 1 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTA GACCCTGTAGATCCGAATTTGTA seq_100012_x1 1 hsa-miR-10a-5p 22 43 1GT u-A 0 u-G TATATACC TGTGTAAG miRNA 1 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTG GACCCTGTAGATCCGAATTTGTG seq_100013_x54 54 hsa-miR-10a-5p 22 44 1GT 0 0 0 TATATACC TGTGTAAG miRNA 1 

file2:

mir_seq         seq name freq mir start end mism add t5 t3 s5 s3 DB ambiguity 
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT TGAGAAGAAGCACTGTAGCTCTT seq_100006_x1 1 hsa-miR-143-3p 61 81 6AT u-TT 0 0 AGTCTGAG GCTCAGGA miRNA 1 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTA GACCCTGTAGATCCGAATTTGTA seq_100012_x0 0 hsa-miR-10a-5p 22 43 1GT u-A 0 u-G TATATACC TGTGTAAG miRNA 1 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTG GACCCTGTAGATCCGAATTTGTG seq_100013_x24 24 hsa-miR-10a-5p 22 44 1GT 0 0 0 TATATACC TGTGTAAG miRNA 1 
hsa-miR-1296-5p_TTAGGGCCCTGGCTCCATCT TTAGGGCCCTGGCTCCATCT seq_100019_x17 17 hsa-miR-1296-5p 16 35 0 0 0 u-CC TGGGTTAG CTCCTTTA miRNA 1 

Файлы называются так и различаются только в той части, между _ и .txt.mirna и является раздел:

Miraligner_94G.txt.mirna 
Miraligner_944G.txt.mirna 

Выходные файлы должны быть что-то вроде этого:

mir_seq         freq_94G  freq_944G  freq_912R 
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT 0   12   55 
+1

Я не понимаю вопрос. Вы хотите иметь один файл со всеми строками всех файлов, объединенных в один файл, путем фильтрации столбцов 'mir_seq' и' freq'? Или вы хотите также фильтровать 'mir_seq' каким-то фильтром? –

+1

Это довольно широкий. Что же касается снятия ненужных аспектов вопроса и работы с простым вводом с желаемым, чистым выходом. Также вы можете показать некоторые из своих попыток? – fedorqui

ответ

2

OK, учитывая что вы обработки файлов:

Miraligner_94G.txt.mirna 
Miraligner_944G.txt.mirna 

похоже, вы просто выбирая столбцы из каждого.

Итак:

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

my %data; 
my %seen; 

foreach my $file (glob("Miraligner_*")) { 
    my ($freq_id) = ($file =~ m/\_(\w+).txt/); 
    $freq_id = "freq_$freq_id"; 
    $seen{$freq_id}++; 
    open(my $input, "<", $file) or die $!; 
    my @headers = split(' ', <$input>); 
    while (<$input>) { 
     my %line; 
     @line{@headers} = split; 
     my $key = $line{'mir_seq'}; 
     $data{$key}{$freq_id} = $line{'freq'}; 
    } 
    close($input); 
} 

my @cols = sort keys %seen; 
print join("\t", "mir_seq", @cols), "\n"; 
foreach my $mir_seq (sort keys %data) { 
    my @output_cols = map { $_ // 0 } @{ $data{$mir_seq} }{@cols}; 
    print join("\t", $mir_seq, @output_cols), "\n"; 
} 

Учитывая набор данных выходов (вкладка запятой):

mir_seq freq_944G freq_94G 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTA 1 0 
hsa-miR-10a-5p_GACCCTGTAGATCCGAATTTGTG 54 24 
hsa-miR-1296-5p_TTAGGGCCCTGGCTCCATCT 0 17 
hsa-miR-143-3p_TGAGAAGAAGCACTGTAGCTCTT 0 1 

Примечание - если значение не определено, оно будет печатать ноль в настоящее время. Вам нужно будет изменить эту карту, если вы хотите напечатать что-то еще.

Он также сортируется по алфавиту на большинстве из них, что также может и не быть тем, что вы хотите, но есть множество примеров сортировки, на которые вы можете ссылаться.

+0

Я получил эту ошибку: непризнанный символ \ xE2; помечен <- ЗДЕСЬ после} = $ line {<- ЗДЕСЬ возле столбца 39 на строке merge.pl 17. – BioMan

+0

Может быть, блуждающий символ от копирования и вставки? – Sobrique

2

Вы только при условии входного файла один образец так очевидно, что это не тестировался, так как вы не можете протестировать «сливаться» с только 1 файл:

awk ' 
FNR==1 { 
    split(FILENAME,tmp,/[_.]/) 
    sfx = tmp[2] 
    sfxs[sfx] 
} 
{ 
    keys[$1] 
    val[$1,sfx] = $4 
} 
END { 
    printf "mir_seq" 
    for (sfx in sfxs) { 
     printf "%sfreq_%s", OFS, sfx 
    } 
    print "" 

    for (key in keys) { 
     printf "%s", key 
     for (sfx in sfxs) { 
      printf "%s%d", OFS, val[key,sfx] 
     } 
     print "" 
    } 
} 
' Miraligner_*