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 がそれらを実行するための最良の方法であるかどうか、および読み取り/書き込みのコンテキストでこれらの操作の構文に関する提案があるかどうか疑問に思っていました。ファイル。

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 に答える