2013-03-22 2 views
2

대용량 텍스트 파일을 거의 하나의 문자로 구성하고 공간으로 구분하여 일련의 편집 작업을 수행하고자합니다. 이 파일은 약 300 개의 행과 약 400,000 개의 열과 약 250MB입니다.대용량 텍스트 파일에서 편집 순서 수행

제 목표는 다른 언어 (R)로 최종 처리하기 위해 일련의 단계를 사용하여이 표를 변환하는 것입니다. 커다란 데이터 파일 작업에 많은 경험이 없지만 PERL이이 문제를 해결하는 가장 좋은 방법이라고 제안되었습니다. 더 좋은 방법이 있다면 알려주십시오 :). 다음

  1. 파일 열기, 편집하거나 새 파일에 기록 :
  2. 는 열을 2-6
  3. 병합을 제거

    그래서, 나는 다음을 수행하는 PERL 스크립트를 작성 바라고

    ,536 :/
  4. 건너

    는 각 행에 순차 알고리즘 조건에 따라 실행되는 각 문자 쌍을 대체 (그래서, 통합 열 2-3,4-5 등)의 2 열에서 시작하여 열 쌍을 연결

    [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 내가 + = 1과 루프 증가 $했다. $ i + = 2 여야하므로 답을 수정했습니다. –

0

당신은 몇 가지 샘플 입력 및 예상 출력을 게시 할 필요가 또는 우리는 단지 당신이 원하는 것을 추측하고하지만 어쩌면이 시작됩니다 :

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