2016-06-23 12 views
1

各.tsvファイルにカスタムヘッダーを挿入し、各ファイルの内容を解析して最終バリアントファイルに追加したいとします。私は1つのループでこれを達成しようとしましたが、うまくいきませんので、2つの別々のループを試しました。最初のループは各.tsvファイルにヘッダーを挿入しますが、2番目のループは挿入されたヘッダーを空の行に置き換えます。誰かがなぜこれが起こっているのか、これをどう解決するのか説明してください。おかげヘッダー行の挿入後のテキストファイル内の空白行の発生

#!perl 
use strict; 
use warnings; 

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){ 

    $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; 
    my $cmd9 = `sed -i '1i$headerline' $tsv_file`; print $cmd9;#local @ARGV = ($tsv_file); 
} 

my $final_variants = $home."test_all_runs/".$ARGV[0]."/final_variant_file.txt"; 
open my $out_fh, '>', $final_variants or die qq{Unable to open "$final_variants" for output: $!}; 

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

##this loop unintentionally replaces the newly inserted header with a blank line. 
for my $tsv_file_new (@tsv_files_new) { 

    print "The current VCF is ############# $tsv_file_new\n"; 

    $tsv_file_new =~ m|([^/]+)-oncomine.tsv$| or die "Can't extract Sample ID"; 
    my $sample_id = $1; 
    print "The sample ID is ############## $sample_id\n"; 

    open my $in_fh, '<', $tsv_file_new 
      or die qq{Unable to open "$tsv_file_new" for input: $!}; 

    while (<$in_fh>) { 

     next if /^#/; 
     next if /\b(?:CNV|intronic|synonymous|utr_3|utr_5)\b/; 
     next if /\b(?:FORMAT.1.FSRF)\b/;# remove the original headers from Ion Reporter. 

     my @fields = split; 
     next if ($fields[70] =~ m|([0.])/\1|); 
     my $chr = $fields[9]."check"; 

     my @wanted = (10, 21, 67, 68, 70, 77, 78, 81, 83, 84, 88, 92, 98, 100); 
     my $current_line = join "\t", @fields[@wanted]; 
     my $current_final_line = $sample_id."\t".$chr."\t".$current_line; 
     print $out_fh $current_final_line, "\n"; 
    } 
} 
exit; 
+0

こんにちは。それは私のコードのように見えます!何を試しましたか?あなたは使用しているプログラム全体を投稿して助けを求めるべきですが、あなたの考えは間違っています。 1つのPerlプログラムに対して複数のファイルとシェルコマンドを使用することになったので、印刷する前に '$ current_line'の作成方法を変更するだけで済みます。書かれた後の変更は間違った考えです – Borodin

+0

私はあなたのプログラムを1行に関係する問題に分割し、すべての問題について新しい質問をします。問題をコード化するのが難しくないので、これらの問題はすべて言語を学ぶことで解決できます。あなたのために、ステップバイステップで尋ねるのではなく、あなたの全体の問題を説明する方が良いかもしれません。 – Piotr

+0

@Borodinあなたのコードに間違いありません。私はちょうど私の質問をあまりにも長く紛らわしくすることなく、一度に一つのことを達成する方法を学ぼうとしています。私は作業していたコードを持っていましたが、中間ファイルがたくさんありましたが、私はプロセス全体を最初から理解するためのよりよい方法があることを知っています。私は 'my $ cmd9 =' sed -i '1i $ SampleID [4]' $ Controldata'を使いました。 print $ cmd9; 'それぞれに最初の行を追加して動作させましたが、今はwhileループにカスタムヘッダーを挿入する必要があります。 – user3781528

答えて

1

これを試してみてください:Perlで

use strict; 
use warnings; 
use Tie::File; 

my $tsv_file = 'test.txt'; 

tie my @textFile, 'Tie::File', $tsv_file, recsep => "\n" or die $!; 
for my $line (@textFile) { 
    $line = "New Sample\n" if($line =~ /FORMAT\.1\.FSRF/); 
} 
untie @textFile; 
+1

"New Sample"という文字列のない空の行が作成されました。私は各サンプルの最初の行を操作しようとしているので、サンプル関連の情報を表示できます。あなたのコードはほとんど機能しましたが、 "New Sample"という空白の行は表示されません。 Andreyに感謝します。 – user3781528

+0

ええ、ファイルのデータがまだ書き込まれていないためだと思います。これは、次のとおりです。*各ループ*との重複出力](http://stackoverflow.com/questions/37978686/duplicated-output-with-for-each-loop) – Borodin

0

を、あなたがしたい場合は、BBBので

$string =~ s/AAA/BBB/; 

でAAAを置き換えることができますしてみてください、その後

#replace lines containing "FORMAT.1.FSRF" with "New Sample" 

$string =~ s/FORMAT\.1\.FSRF/New Sample/g; 

各行に1回だけ交換する場合は、最後のgを削除してください。

+0

ヘッダー行を削除して置き換えようとしています各ファイルに特有のカスタムメイドヘッダーが付いています。ヘッダー行だけが「FORMAT.1.FSRF」を含んでいるので、私はそれを検索文字列として使用しています。ありがとう – user3781528

関連する問題