2015-02-10 2 views
-5

ссылка на файлКак сравнить и объединить несколько файлов?

chr1 288598 288656 

chr1 779518 779576 

chr2 2569592 2569660 

chr3 5018399 5018464 

chr4 5182842 5182882 

file1

chr1 288598 288656 12 

chr1 779518 779576 14 

chr2 2569592 2569660 26 

chr3 5018399 5018464 27 

chr4 5182842 5182882 37 

file2

chr1 288598 288656 35 

chr2 2569592 2569660 348 

chr3 5018399 5018464 4326 

chr4 5182842 5182882 68 

У меня есть шесть подобных файлов, исключающие справочного файла.

Здесь первые три поля аналогичны ссылочному файлу. Поэтому я хотел бы экспортировать только 4-й столбец из всех 6 файлов и помещать в файл ссылки, чтобы сделать новый вывод. который должен быть эквивалентен справочным файлам. Где они не соответствуют нулю.

требуемый выход

chr1 288598 288656 23 35 57 68 769 68 

chr1 779518 779576 23 0 57 68 768 0 

chr2 2569592 2569660 23 35 0 68 79 0 

chr3 5018399 5018464 0 36 0 68 769 0 

chr4 5182842 5182882 23 0 0 0 0 0 

Примечание: длина опорного файла составляет около 2000 анс остальные файлы не всегда находятся в той же длины (около 500, 400, 200, 100 и т.д.). Вот почему нулевой добавлен.

Я попробовал ответ от this question

paste ref.file file1 file2 file3 file4 file5 file6 | awk '{OFS="\t";print $1,$2,$3,$7,$11,$15,$19,$23,$27}' > final.common.out 

, но кажется, что это не работает - некоторые значения пропускаются. И я не могу понять, как добавить ноль, где нет совпадения.

+0

Подсказка: посмотрите на команду соединения. – SMA

+1

Есть ли в вашем файле пустые строки? Я предполагаю, что нет, но почему вы так им показали? – Borodin

+0

Нет извинения ..... нет пробелов. – unique379

ответ

1

Я думаю, что что-то подобное должно делать то, что вы хотите. Мы используем хеш для сбора файла 'reference' и превращаем его в набор ключей с пустым массивом.

Затем мы перебираем другие файлы, извлекаем «3 значения» в качестве ключа и последнее значение как фактическое значение.

И затем мы сравниваем два, обновляя хеш-ссылку «reference» с нулевым значением. Оговорка здесь - любые строки не в вашем файле справки (или дубликатов) просто исчезнут.

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 


#read 'reference file' into a hash: 
my %ref; 
open(my $ref_fh, "<", "reference_file"); 
while (<$ref_fh>) { 
    my ($first, $second, $third) = split; 

    #turn the first three fields into space delimited key. 
    $ref{"$first $second $third"} =(); 
} 

#open each of the files. 
my @files = qw (file1 file2 file3 file4 file5 file6); 
foreach my $input (@files) { 
    open(my $input_fh, "<", $input); 
    my %current; 
    while (<$input_fh>) { 

     #line by line, extract 'first 3 fields' to use as a key. 
     #then 'value' which we store. 
     my ($first, $second, $third, $value) = split; 
     $current{"$first $second $third"} = $value; 
    } 

    #refer to 'reference file' and insert matching value or zero into 
    #the array. 
    foreach my $key (keys %ref) { 
     push(@{ $ref{$key} }, $current{$key} ? $current{$key} : 0); 
    } 
} 

foreach my $key (keys %ref) { 
    print join(" ", $key, @{ $ref{$key} }); 
} 
+0

Большое вам спасибо за хороший код, его работа хорошо, но из-за необходимости создать новую строку для каждого матча , потому что все это в одной строке. – unique379

+0

Огромное вам спасибо за хороший код, его работа хорошо, но для этого требуется новая строка и вкладка для каждого матча. Однако, я сделал. Спасибо за ваше драгоценное время и помощь. – unique379