2

我希望对一个几乎完全由单个字母组成的大型文本文件进行一系列编辑,由空格分隔。该文件大约 300 行 x 大约 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 是否是最好的方法,以及在读/写上下文中是否对这些操作的语法有任何建议一份文件。

4

2 回答 2

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";
}

那应该让你上路。

于 2013-03-22T23:34:12.760 回答
0

您需要发布一些示例输入和预期输出,或者我们只是在猜测您想要什么,但也许这将是一个开始:

awk '{
   printf "%s ", $1
   for (i=7;i<=NF;i+=2) {
      printf "%s%s ", $i, $(i+1)
   }
   print ""
}' file
于 2013-03-23T03:10:07.770 回答