ブロックされたファイルを解析し、より小さなファイルを生成します。

ブロックされたファイルを解析し、より小さなファイルを生成します。

次のファイルがあります。

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

同様に、1つのファイルに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 ); 
}

注 - 「最初の」ブロックはゼロであるため、まったく必要な順序ではありませんが、最初のファイル番号は1です。加算/減算と同じくらい簡単です$. + 1 % $num_files_to_write。しかし、どのファイルが何をインポートするのか興味があるのか​​、それともパーティションの問題なのかによって異なります。

関連情報