Analisando um arquivo bloqueado e gerando arquivos menores

0

Eu tenho um arquivo como abaixo:

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

Da mesma forma, posso ter perto de 20.000 blocos 1 para o bloco 5 em um único arquivo

Eu preciso contar o número de blocos 1 para o bloco 5 e dividir o arquivo em 4 arquivos menores. Os primeiros 3 arquivos podem ter o mesmo número de blocos 1 para o bloco 5 e o último arquivo menor pode ter os blocos restantes 1 no bloco 5's.

Digamos que eu tenha cinco blocos 1 para bloquear 5's

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

Eu gerarei 4 arquivos como abaixo

Arquivo 1:

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

Arquivo 2:

1hdohdsohsoihssodhoishs
2nfdksnkdsnfsdsjndkdj
3kjdscdskndskjndndsdsdsd
5

Arquivo 3:

1weather dnsndjsdn 
2nm bdbdb bdbdbdbdnnd
3gfdu hsihdishdis
5

Arquivo 4:

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

Alguém por favor pode sugerir como isso pode ser conseguido usando o script Unix.

Qualquer ajuda é muito apreciada.

    
por tradersjoe 10.12.2015 / 21:09

2 respostas

0

Com grep?

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

Não testado.

    
por 10.12.2015 / 21:43
0

OK, então - pegando alguma entrada, separando-a em 5 e então dividindo os pedaços em arquivos separados?

Na verdade, é um pouco mais difícil do que colocar 'extra' no último arquivo, já que você precisa ler a coisa toda primeiro antes de conhecer a distribuição, mas é muito fácil rodar o robin saída:

  • Abrir 4 filehandles
  • define o separador de registros como 5 .
  • iterar registros de entrada, selecionando um identificador de arquivo com base no número "chunk" $.
  • imprima para esse fh

Algo como:

#!/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 ); 
}

Nota - não faz exatamente o pedido que você queria, porque o 'primeiro' pedaço é zero, mas o seu primeiro número de arquivo é 1. Isso é tão simples quanto adicionar / subtrair $. + 1 % $num_files_to_write , por exemplo. Mas isso depende se você se importa exatamente com qual arquivo obtém o que, ou se é apenas uma questão de dividir.

    
por 11.12.2015 / 17:31