2016-06-28 7 views
2

指定したディレクトリ内の各ファイルのFOCUS * .tsvファイルに関連する一意の1行ヘッダーを追加したいとします。その後、これらのファイルをすべて1つのファイルに結合したいと考えています。ディレクトリ内の特定のファイルにカスタムヘッダーを追加する

最初に私はsedコマンドを試しました。

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

それが働いたように見えたが、私は、コードの次のセクションで一つのファイルにこれらのファイルのすべてを組み合わせるした後、挿入された行は、各ファイルの4倍に上場しました。

私はこれを達成するために以下の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、 '<'、'に変更しました。しかし、ファイルを結合したコードを実行すると、各ヘッダー行が4回出現しました。 (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: $!"; 
    

    注意です。それ以外の場合は、それが何であるか分かりません。

  • unlinkrenameは、1つのファイルを別のファイルに上書きしているようです。あなたは、コアモジュールからFile::Copy

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

    moveを使用することによってそれはとても上書き、それに_new 1の名前を変更し、目的のファイル$tsv_fileが切り捨てられますことを行うことができます。ファイルを組み合わせることする必要があるかについては


、より正確な説明が必要であろう。

関連する問題