各.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;
こんにちは。それは私のコードのように見えます!何を試しましたか?あなたは使用しているプログラム全体を投稿して助けを求めるべきですが、あなたの考えは間違っています。 1つのPerlプログラムに対して複数のファイルとシェルコマンドを使用することになったので、印刷する前に '$ current_line'の作成方法を変更するだけで済みます。書かれた後の変更は間違った考えです – Borodin
私はあなたのプログラムを1行に関係する問題に分割し、すべての問題について新しい質問をします。問題をコード化するのが難しくないので、これらの問題はすべて言語を学ぶことで解決できます。あなたのために、ステップバイステップで尋ねるのではなく、あなたの全体の問題を説明する方が良いかもしれません。 – Piotr
@Borodinあなたのコードに間違いありません。私はちょうど私の質問をあまりにも長く紛らわしくすることなく、一度に一つのことを達成する方法を学ぼうとしています。私は作業していたコードを持っていましたが、中間ファイルがたくさんありましたが、私はプロセス全体を最初から理解するためのよりよい方法があることを知っています。私は 'my $ cmd9 =' sed -i '1i $ SampleID [4]' $ Controldata'を使いました。 print $ cmd9; 'それぞれに最初の行を追加して動作させましたが、今はwhileループにカスタムヘッダーを挿入する必要があります。 – user3781528