对大文本文件执行编辑序列

时间:2013-03-22 18:49:57

标签: r perl sed awk

我希望对一个几乎完全由单个字母组成的大文本文件进行一系列编辑,并用空格分隔。该文件大约有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列并删除所有其他

  6. 我刚刚开始学习PERL,所以我想知道这些操作是否可能在PERL中,PERL是否是最好的方法,以及在阅读环境中是否有关于这些操作的语法建议/写入文件。

2 个答案:

答案 0 :(得分: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";
}

这应该可以帮助你。

答案 1 :(得分:0)

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

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