2016-06-28 7 views
2

Я хотел бы добавить уникальный заголовок одной строки, относящийся к каждому файлу FOCUS * .tsv-файла в указанном каталоге. После этого я хотел бы объединить все эти файлы в один файл.Добавление пользовательского заголовка в определенные файлы в каталоге

Сначала я пробовал команду sed.

`my $cmd9 = `sed -i '1i$SampleID[4]' $tsv_file`;` print $cmd9; 

Похоже, он работал, но после того, как я объединил все эти файлы в один файл в следующем разделе кода, вставленная строка была перечислена в четыре раза для каждого файла.

Я пробовал использовать следующий скрипт Perl, но он удалил содержимое файла и только распечатывает добавленный заголовок.

Я ищу самый простой способ выполнить то, что я ищу. Вот что я пробовал.

#!perl 
use strict; 
use warnings; 
use Tie::File; 

my $home="/data/";              
my $tsv_directory = $home."test_all_runs/".$ARGV[0]; 
my $tsvfiles = $home."test_all_runs/".$ARGV[0]."/tsv_files.txt"; 

my @run_directory =(); @run_directory = split /\//, $tsv_directory; print "The run directory is #############".$run_directory[3]."\n"; 

my $cmd = `ls $tsv_directory/FOCUS*\.tsv > $tsvfiles`; #print "$cmd"; 
my $cmda = "ls $tsv_directory/FOCUS*\.tsv > $tsvfiles"; #print "$cmda"; 

my @tsvfiles =(); 
#this code opens the vcf_files.txt file and passes each line into an array for indidivudal manipulation 
open(TXT2, "$tsvfiles"); 
     while (<TXT2>){ 
       push (@tsvfiles, $_); 
       } 
close(TXT2); 

foreach (@tsvfiles){ 
     chop($_); 
} 

#this loop works fine 
for my $tsv_file (@tsvfiles){ 

     open my $in, '>', $tsv_file or die "Can't write new file: $!";  
     open my $out, '>', "$tsv_file.new" or die "Can't write new file: $!"; 

    $tsv_file =~ m|([^/]+)-oncomine.tsv$| or die "Can't extract Sample ID"; 
    my $sample_id = $1; 
    #print "The sample ID is ############## $sample_id\n"; 
    my $headerline = $run_directory[3]."/".$sample_id; 
    print $out $headerline; 
    while(<$in>) { 
    print $out $_; 
    } 

    close $out; 
    close $in; 

unlink($tsv_file); 
rename("$tsv_file.new", $tsv_file); 

} 

Спасибо

+0

(1) Является ли этот код именно тем, чем вы управляете? Вы открываете файл '$ in' с'> ', поэтому для записи. Должно быть '<' для чтения. В противном случае код, который вы показываете, действительно должен содержать строку. (2) Как вы хотите «_combine_» эти файлы? // Есть и другие вещи, которые можно улучшить. – zdim

+0

Я изменил '$ in на' $ in, '<', 'и это сработало. Однако, когда я запускал код, который объединяет файлы, каждая строка заголовка появляется четыре раза. (2) Я объединяю определенные строки и столбцы из каждого файла. Каждый файл имеет точно такой же формат, поэтому я просматриваю массив файлов и добавляю один за другим. Без добавленных заголовков он отлично работает. спасибо – user3781528

+0

Например, я исключаю строки с CNV | intronic | synonymous | utr_3 | utr_5 и интересуюсь только конкретными столбцами, которые я изменяю до добавления к окончательному файлу. – user3781528

ответ

1

По-видимому, неправильно '>' при открытии файла для чтения была проблема, и удалось решить.

Однако я хотел бы сделать несколько комментариев по остальной части кода.

  • Список файлов построен, запустив внешний ls перенаправлен в файл, то при чтении этого файла в массив. Тем не менее, это именно работа glob и все это заменяется

    my @tsvfiles = glob "$tsv_directory/FOCUS*.tsv"; 
    

    Тогда вам не нужно chomp либо, и chop, который используется бы на самом деле больно, так как он удаляет последний символ , а не только новой строки (или действительно $/).

  • Использование chop, вероятно, не то, что вы хотите. Если вы удаляете строки ($/) использовать chomp

  • Чтобы извлечь спичку и назначить его, общий идиом

    , что я также добавил $!, на самом деле печатать ошибку
    my ($sample_id) = $tsv_file =~ m|([^/]+)-oncomine.tsv$| 
        or die "Can't extract Sample ID: $!"; 
    

    Примечания. В противном случае мы просто не знаем, что это было.

  • unlink и rename, кажется, переписывают один файл другим. Вы можете сделать это с помощью move из основного модуля File::Copy

    use File::Copy qw(move); 
    move ($tsv_file_new, $tsv_file) 
        or die "Can't move $tsv_file to $tsv_file_new: $!"; 
    

    Это усечение целевой файл $tsv_file, переименовав _new один в ней, так перезапись.


А как файлы должны быть объединены, более точное объяснение будет необходимо.

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

  • Нет связанных вопросов^_^