Usando Perl para números pares / ímpares

0

Atualmente, estou usando um processo para criar um conjunto muito específico de quatro arquivos. O processo que estou usando é mostrado na imagem de processo anexada, abaixo:

Aprimeiralinhaépartedeumasolução,dadaaumaperguntaanteriorsobre números serializados aleatórios .

perl -e 'for(RANGESTART..RANGESTOP){$x = $_ + 0; print "$x" . "','\n";}' > filename.csv

Como você pode ver, o RANGESTART é geralmente algo como 30000000 RANGESTOP geralmente seria algo como 30010000, dando-me 10.000 números, contando a partir de 30.000.000.

Para fins de validação (Requisito do órgão regulador), tenho que executar uma verificação para garantir que os números gerados sejam exclusivos e nunca duplicados. Essa validação deve criar um arquivo secundário (filename-sort.csv). Para conseguir isso, estou usando:

sort -u -o filename1.csv filename2.csv

Neste momento, tenho dois arquivos.

Eu tenho que usar um aplicativo de terceiros (Barman da Seagull Scientific), para fins de impressão de etiquetas, em uma linha de produção. Um lado da linha precisa de um arquivo com apenas números pares, o outro lado precisa de um arquivo com apenas números ímpares. Para conseguir isso, estou usando:

awk '{print>sprintf("%sfile.csv",NR%2?"even":"odd",PROCINFO["pid"])}' filename.csv

Agora eu tenho meus quatro arquivos.

Esses quatro arquivos são um requisito, para apaziguar uma possível auditoria, por um Órgão Regulador.

Esse processo funciona bem, mas requer meu envolvimento direto, toda vez que um novo conjunto de números é necessário.

Minha pergunta tem duas partes:

Parte A: Eu gostaria de fazer tudo isso com três comandos perl individuais, da mesma maneira que eu já estou fazendo isso com perl, sort e awk.

Parte B: Eu gostaria de poder combinar esses três comandos perl, em um único script perl, deixando os três comandos perl da Parte A, intacto em sua forma original.

Eu imagino que este script perl peça a um usuário um número inicial, um número final e uma data com 8 dígitos (AAAAMMDD). À medida que o script é concluído, ele deve solicitar a entrada do usuário para confirmar a criação do primeiro arquivo (YYYYMMDD.csv), confirmar a criação do arquivo classificado (YYYYMMDD-sort.csv) e confirmar a criação de arquivos pares / ímpares (evenfile. csv & oddfile.csv).

Eu imagino que os pedidos de criação de arquivos funcionem assim:

  1. Insira "Y" ou "YES" para criar YYYYMMDD.csv (qualquer outra resposta deve sair do script).
  2. Insira "Y" ou "YES" para criar YYYYMMDD-sort.csv (qualquer outra resposta deve sair do script).
  3. Insira "Y" ou "YES" para criar evenfile.csv e oddfile.csv (qualquer outra resposta deve sair do script).

Por fim, gostaria que este script perl fosse executado a partir do Terminal Apple, Terminal Linux e Linha CMD do Windows 7 Pro.

Estou pedindo demais? Se sim porque? Se não, como?

    
por bamajr 21.04.2016 / 17:21

1 resposta

0

Parece que seu trabalho pode ser reduzido para:

perl -e '
    use POSIX qw(strftime);

    my ($start, $num) = (30_000_000, 10_000);
    my @all   = ( $start .. $start + $num -1 );  # 10,000 numbers
    my @odds  = grep { $_ % 2 == 1 } @all;
    my @evens = grep { $_ % 2 == 0 } @all;

    my $filename = strftime "%Y%m%d", localtime;
    my $fh;
    open $fh, ">", "$filename.csv";       print $fh join("\n", @all), "\n";   close $fh;
    open $fh, ">", "$filename-sort.csv";  print $fh join("\n", @all), "\n";   close $fh;
    open $fh, ">", "$filename-odds.csv";  print $fh join("\n", @odds), "\n";  close $fh;
    open $fh, ">", "$filename-evens.csv"; print $fh join("\n", @evens), "\n"; close $fh;
'

Como eu disse, não entendo a necessidade de ter um arquivo classificado, já que o arquivo já está classificado.

    
por 23.04.2016 / 20:09

Tags