차단된 파일을 구문 분석하고 더 작은 파일을 생성합니다.

차단된 파일을 구문 분석하고 더 작은 파일을 생성합니다.

다음과 같은 파일이 있습니다.

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5
1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5

마찬가지로, 한 파일에 1부터 5까지의 청크가 거의 20,000개 있을 수 있습니다.

청크 1부터 5까지의 수를 계산한 다음 파일을 더 작은 4개의 파일로 분할해야 합니다. 처음 3개 파일은 동일한 수의 블록 1~5를 가질 수 있으며, 마지막 작은 파일에는 나머지 블록 1~5가 있을 수 있습니다.

1부터 5까지 5개의 블록이 있다고 가정해 보겠습니다.

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5
1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5
1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5
1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5
1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

다음과 같이 4개의 파일을 생성하겠습니다.

파일 1:

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

파일 2:

1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5

파일 3:

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

파일 4:

1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5
1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

Unix 스크립트를 사용하여 이를 달성하는 방법을 제안할 수 있는 사람이 있습니까?

어떤 도움이라도 대단히 감사하겠습니다.

답변1

그렙을 사용하시겠습니까?

grep -E '^1' < file_to_parse > blocks_1
grep -E '^2' < file_to_parse > blocks_2
grep -E '^3' < file_to_parse > blocks_3
grep -v -E '^1' | grep -v -E '^2' | grep -v -E '^3' < file_to_parse > other_blocks

검증되지 않은.

답변2

좋습니다. 입력을 받아 분리한 5다음 해당 청크를 별도의 파일로 분할하시겠습니까?

실제로 마지막 파일에 "추가"를 추가하는 것은 전체 파일을 읽어야 하기 때문에 생각보다 조금 어렵습니다.첫 번째분포를 알기 전에는 출력을 반복하는 것이 쉽습니다.

  • 4개의 파일 핸들 열기
  • 레코드 구분 기호를 로 설정합니다 5.
  • 입력 레코드를 반복하여 "블록" 번호를 기준으로 파일 핸들을 선택합니다.$.
  • 해당 fh로 인쇄

그것은 다음과 같습니다:

#!/usr/bin/env perl
use strict;
use warnings;

my $num_files_to_write = 4;
use Data::Dumper;

my @filehandles; 
for my $id ( 1..$num_files_to_write ) {
   open ( my $fh, '>', "file_$id.txt" ) or die $!;
   push @filehandles, $fh; 
}

local $/ = '5';
while ( <> ) {
    select $filehandles[$. % $num_files_to_write];
    print; 
}

foreach my $fh ( @filehandles ) { 
   close ( $fh ); 
}

참고 - "첫 번째" 블록이 0이기 때문에 정확히 원하는 순서가 아니지만 첫 번째 파일 번호는 1입니다. 더하기/빼기만큼 간단합니다 $. + 1 % $num_files_to_write. 하지만 어떤 파일이 무엇을 가져오는지 관심이 있는지 아니면 단지 파티션 문제인지에 따라 다릅니다.

관련 정보