2016-03-30 7 views
0
私は別のfile.For例に続いている特定の順序でファイルの内容をソートしたい

perlスクリプトは、別のファイルにリストされているのと同じ順序でファイルをソートしますか?

入力はFile1:

dff_0_1:G11

dff_0_5:N_25

dff_0: G10

dff_0_3:G13

dff_0_2:G12

入力ファイル2:

G13

G11

G12

G10

N_25

出力ファイル1:

dff_0_3:G13

dff_0_1:G11

dff_0_2:G12

dff_0:G10

dff_0_5:私が望むようにここでN_25

は、私が書いたPerlのコードですが、そのは動作していません。

my @input_file2 = <IN2>; 

chomp @input_File2; 

while (<input_file1>) { 

foreach my $i (0..$#input_File2){ 

print OUT43 if /(.+)\:\Q$input_File1[$i]\E/; 

} 

} 

close (IN33); 

close (IN43); 

close (OUT43); 

答えて

0

使用grepそれをするため。 grepは、配列から一致した要素を返し、grepの出力を格納するリストを構築します。 selectを使用して、print文の内容を新しいファイルに書き込んでください。

字句ファイルハンドラを使用する場合は、ファイル

open my $fh1, "<", "one.txt"; 
open my $fh2 , "<","two.txt"; 
open my $wh, ">","output.txt"; 
my @data1 = <$fh1>; 
select ($wh); 

while (my $line = <$fh2>) 
{ 
    chomp $line; 
    my ($sort_data) = grep{/$line$/} @data1; 
    print "$sort_data"; 
} 
0

コードには多くの誤りがあります。

  1. あなたは私の@input_ F ile2配列を宣言したが@input_ Fをムシャムシャ食べる ile2
  2. があなたのwhile (<input_file1>) {の「input_file1 "ファイルハンドルですか?
  3. あなたはforeach $#input_File2を使用しますが、正規表現では$ input_File1を使用します。 FILE2

のループ内

  • あなたがすべきループFILE1は、私はほとんど変化してあなたのコードを編集した:

      #!/usr/bin/perl 
    
          open (IN33, "<1.txt") or die "can't open file 1.txt"; 
          open (IN43, "<2.txt") or die "can't open file 2.txt"; 
          open (OUT43, ">out.txt") or die "can't open file out.txt"; 
    
          my @input_file2 = <IN43>; 
          my @input_file1 = <IN33>; 
    
          chomp @input_file2; 
    
    
          foreach my $i (@input_file2){ 
          foreach (@input_file1) { 
    
          print OUT43 if /(.+)\:\Q$i\E/; 
    
          } 
    
          } 
    
          close (IN33); 
    
          close (IN43); 
    
          close (OUT43); 
    
  • +0

    を閉じるする必要があなたにも成功した場合にループ間を破る必要がありますありません。 –

    +3

    レキシカルファイルハンドルを使用しようとすると、ファイルを閉じる必要はありません:) – mkHun

    関連する問題