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.
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
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
Alguém por favor pode sugerir como isso pode ser conseguido usando o script Unix.
Qualquer ajuda é muito apreciada.
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.
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:
5
. $.
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.
Tags perl scripting shell-script