入力テキスト ファイルを解析し、3 つの新しいテキスト ファイルを出力するスクリプトを作成しました。入力ファイルにはヘッダー行があり、3 つの出力ファイルのそれぞれから除外されています。出力ファイルの各行は、すべての入力ファイル行の最初の 3 つのエントリを取得し、次に入力行のエントリの一部のみを取得します。すべてのファイルはタブ区切りです。
私の問題は、出力行の最後に余分な空白が入り続けることです。VIM で表示すると、出力ファイルの行末にこの空白が表示されます。Excel で表示すると、これらの余分な空白が表示されません。
以前、以前のバージョンのスクリプトを使用すると、Excel を使用して行末に余分な空白が表示されましたが、これは「すべて選択」機能を使用した場合のみでした。Excel に表示されるデータは、perl スクリプトが配列を出力した結果であり、ここでprint $outfile "@array"
. タイピングprint "@array"
が一種の補間を引き起こし、行に空白が追加されることをスタックオーバーフローの他の場所で学びました。この補間によって生じた空白は、Excel ではすぐには表示されませんでしたが、データを強調表示するために「すべて選択」を使用すると表示されました。そこで、コードを から に変更しprint $outfile "@array"
ましたprint $outfile @array
。この変更により、各出力行の末尾に空白が残る出力ファイルが生成されます。この空白は VIM では表示されますが、Excel では表示されません。これは私が立ち往生しているところです。
これが私のスクリプトです。最初の部分は、入力ファイルを開いて読み取るだけです。次に、いくつかの配列が宣言されます。次に、for loop
入力ファイルの行ごとの解析を開始し、適切なコンテンツを適切な配列にプッシュします。1 つの配列に対して置換が実装されます。繰り返しますが、すべてのファイルはタブ区切りです。最後に、配列は 3 つの出力ファイルに出力されprint $outfile @array
ますprint $outfile "@array"
。
問題が見えますか?ありがとう!
#!/usr/bin/perl
use strict; use warnings;
die "usage: [ imputed genotype.file ]\n" unless @ARGV == 1;
my $imputed = $ARGV[ 0 ];
open ( my $FILE, "<$imputed" );
my @data = <$FILE>;
my @ADD = ();
my @DOM = ();
my @IMP = ();
for ( my $i = 1; $i < scalar @data; $i++ ) ### for each line data[i], and use $i = 1 to
### skip header, 0 to include it output
{
my $line = $data[ $i ];
chomp $line;
my @entries = split( '\t', $data[ $i ] );
push( @ADD, "$entries[ 0 ]\t$entries[ 1 ]\t$entries[ 2 ]\t" );
push( @DOM, "$entries[ 0 ]\t$entries[ 1 ]\t$entries[ 2 ]\t" );
push( @IMP, "$entries[ 0 ]\t$entries[ 1 ]\t$entries[ 2 ]\t" );
for ( my $i = 3; $i < scalar @entries - 1 ; $i+=3 ) ### for each entry per line
{
push( @ADD, "$entries[ $i ]\t" );
push( @DOM, "$entries[ $i + 1 ]\t" );
if ( $entries[ $i + 2 ] eq 'NA' ) ### to replace any occuring "NA"s with blanks
{
$entries[ $i + 2 ] =~ s/NA//;
}
push( @IMP, "$entries[ $i + 2 ]\t" );
}
push( @ADD, "\n" );
push( @DOM, "\n" );
push( @IMP, "\n" );
} ### for loop
open my $Afile, ">$imputed" . "_ADD.txt" or die $!;
print $Afile @ADD;
close $Afile;
open my $Dfile, ">$imputed" . "_DOM.txt" or die $!;
print $Dfile @DOM;
close $Dfile;
open my $Ifile, ">$imputed" . "_IMP.txt" or die $!;
print $Ifile @IMP;
close $Ifile;