1

入力テキスト ファイルを解析し、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;
4

2 に答える 2

6

配列要素の最後に \t を使用する際の問題。使用機能

join( "\t", ...) 

代わりは。

つまり、出力配列を作成してから使用するだけです

print join "\t", @output;

テストされていない例があります:

#!/usr/bin/perl
use strict; use warnings;

die "usage: [ imputed genotype.file ]\n" unless @ARGV == 1;

open my $Afile, ">$imputed" . "_ADD.txt" or die $!;
open my $Dfile, ">$imputed" . "_DOM.txt" or die $!;
open my $Ifile, ">$imputed" . "_IMP.txt" or die $!;

<>; #skip header
while(<>){ 
      chomp;
      my @entries = split( '\t', $_ );

      my @ADD = ();
      my @DOM = ();
      my @IMP = ();

      push( @ADD, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);
      push( @DOM, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);
      push( @IMP, $entries[ 0 ], $entries[ 1 ], $entries[ 2 ]);

      for ( my $i = 3; $i < scalar @entries - 1 ; $i+=3 ) { ### for each entry per line
          push( @ADD, $entries[ $i ] );
          push( @DOM, $entries[ $i + 1 ] );

      $entries[ $i + 2 ] =~ s/^NA$//; 

          push( @IMP, $entries[ $i + 2 ] );
      }

      print $Afile join( "\t", @ADD) , "\n"; 
      print $Dfile join( "\t", @DOM) , "\n"; 
      print $Ifile join( "\t", @IMP) , "\n"; 

} ### for loop   

close $Afile;
close $Dfile;
close $Ifile;
于 2012-12-21T20:33:37.863 に答える
2
push( @ADD, "$entries[ 0 ]\t$entries[ 1 ]\t$entries[ 2 ]\t" );

これらの行は常に最後にタブを追加します。これはおそらくあなたが見ているものです。また、join次のように、文字列補間の代わりに と 配列スライスを使用することを検討してください。

push( @ADD, join( "\t", @entries[0..2] ) );
于 2012-12-21T20:34:09.020 に答える