2013-03-22 68 views
2

我希望對幾乎完全由單個字母組成的大型文本文件執行一系列編輯,這些編輯文件由空格分隔。該文件大約300行,大約400,000列,大約250 MB。在大文本文件上執行編輯序列

我的目標是使用一系列步驟轉換此表格,以便最終用另一種語言(R可能)處理。我沒有太多處理大數據文件的經驗,但是PERL被認爲是最好的解決方法。請讓我知道如果有更好的方法:)。

所以,我希望寫一個Perl腳本,執行以下操作:

  1. 打開文件,編輯或寫入到一個新的文件中:
  2. 刪除列2-6
  3. 合併從第2列開始(如此,合併列2-3,4-5等)
  4. 根據按照每行的運行順序條件算法替換每個字符對:

    [example PSEUDOCODE: if character 1 of cell = character 2 of cell=a, cell=1 
    else if character 1 of cell = character 2 of cell=b, cell=2 
    etc.] such that except for the first column, the table is a numerical matrix 
    
  5. 刪除所有n列,或保留每n列,並刪除所有其他

我剛開始學習PERL,所以我在想,如果這些操作在Perl是可能的,無論是PERL會是做這些操作的最佳方式,並且如果在讀取/寫入文件的上下文中對這些操作的語法有任何建議。

回答

1

我將開始:

use strict; 
use warnings; 
my @transformed; 
while (<>) { 
    chomp; 
    my @cols = split(/\s/); # split on whitespace 
    splice(@cols, 1,6);  # remove columns 
    push @transformed, $cols[0]; 
    for (my $i = 1; $i < @cols; $i += 2) { 
    push @transformed, "$cols[$i]$cols[$i+1]"; 
    } 

    # other transforms as required 


    print join(' ', @transformed), "\n"; 
} 

這應該讓你對你的方式。

+0

注:IA了$ I + = 1作爲循環增量。它應該是$ i + = 2,所以我編輯了答案。 – 2013-03-25 05:20:19

0

您需要發佈一些樣品的輸入和預期的輸出或者我們只是猜測你想要什麼,但也許這將是一個開始:

awk '{ 
    printf "%s ", $1 
    for (i=7;i<=NF;i+=2) { 
     printf "%s%s ", $i, $(i+1) 
    } 
    print "" 
}' file