2013-04-03 79 views
0

在合併/級聯/合成/裝訂等以下perl腳本

  1. 需要幫助一些幫助我有幾個ASCII文件各自限定一個可變我已經轉換成單個列陣列

我對很多變量都有這樣的列數據,所以我需要執行一個列綁定,如R,並將其作爲一個單獨的文件。

我可以在R中做同樣的事情,但是文件太多。能夠用一個單一的代碼做到這一點將有助於節省大量的時間。

使用下面的代碼,新的perl和需要幫助。這裏

@filenames = ("file1.txt","file2.txt"); 
open F2, ">file_combined.txt" or die; 
for($j = 0; $j< scalar @filenames;$j++){ 
    open F1, $filenames[$j] or die; 
    for($i=1;$i<=6;$i++){$line=<F1>;} 
    while($line=<F1>){ 
     chomp $line; 
     @spl = split '\s+', $line; 
     for($i=0;$i<scalar @spl;$i++){ 
      print F2 "$spl[$i]\n"; 
      paste "file_bio1.txt","file_bio2.txt"> file_combined.txt; 
     } 
    } 
    close F1; 
} 

輸入文件是一個raster.They的ASCII文本文件看起來像沒有貼語法這

32 12 34 21 32 21 22 23 
12 21 32 43 21 32 21 12 

上面提到的這些代碼文件轉換成單柱

32 
12 
34 
21 
32 
21 
22 
23 
12 
21 
32 
43 
21 
32 
21 
12 


The output should look like this 
12 21 32 
32 23 23 
32 21 32 
12 34 12 
43 32 32 
32 23 23 
32 34 21 
21 32 23 

每列表示一個不同的ascii文件。 我需要將大約15個這樣的ASCII文件合併到一個數據框中。我可以在R中執行相同的操作,但由於文件和感興趣區域的數量太多,文件也有點大,所以它會消耗大量時間。

+1

假設你是在一個* nix的環境有關使用'如何加入'?另外,file_bio1.txt和file_bio2.txt從哪裏來?你是否試圖在沒有反引號的情況下調用'paste'? – squiguy

+0

我不完全清楚你想要做什麼? – chrsblck

+0

沒有這是一個打字錯誤,我的意思是寫file1.txt等...當我嘗試代碼時,它給了我一個錯誤,找不到字符串終止符在EOF之前的任何地方(line12)。請嘗試加入 –

回答

1

讓我們一步步通過你有什麼...

# files you want to open for reading.. 
@filenames = ("file1.txt","file2.txt"); 

# I would use the 3 arg lexical scoped open 
# I think you want to open this for 'append' as well 
# open($fh, ">>", "file_combined.txt") or die "cannot open"; 
open F2, ">file_combined.txt" or die; 

# @filenames is best thought as a 'list' 
# for my $file (@filenames) { 
for($j = 0; $j< scalar @filenames;$j++){ 
    # see above example of 'open' 
    # - $filenames[$j] + $file 
    open F1, $filenames[$j] or die; 

    # what are you trying to do here? You're overriding 
    # $line in the next 'while loop' 
    for($i=1;$i<=6;$i++){$line=<F1>;} 
    # while(<$fh1>) { 
    while($line=<F1>){ 
     chomp $line; 
     # @spl is short for split? 
     # give '@spl' list a meaningful name 
     @spl = split '\s+', $line; 
     # again, @spl is a list... 
     # for my $word (@spl) { 
     for($i=0;$i<scalar @spl;$i++){ 
      # this whole block is a bit confusing. 
      # 'F2' is 'file_combined.txt'. Then you try and merge 
      # (and overwrite the file) with the paste afterwards... 
      print F2 "$spl[$i]\n"; 
      # is this a 'system call'? 
      # Missing 'backticks' or 'system' 
      paste "file_bio1.txt","file_bio2.txt"> file_combined.txt; 
     } 
    } 
    # close $fh1 
    close F1; 
} 
# I'm assuming there's a 'close F2' somewhere here.. 

它看起來像你試圖做到這一點:

@filenames = ("file1.txt","file2.txt"); 
$oufile = "combined_text.txt"; 
`paste $filenames[0] $filenames[1] > $outfile`; 
+0

Yes.Also這些文件(file1.text等)是網格柵格數據的ascii文件,所以我試圖將每個文件粘貼爲一列,同時將這些ascii文件轉換爲單個列。 –