2013-03-22 31 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