Como extrair números específicos de arquivos para resolver uma equação?

2

Eu tenho vários arquivos que se parecem com isso:

//   copyright kkshlglkf
//   lhafslghldk
//   rsghlgsrlskl
//   sgkg
//   sgrjgrs
//   Memory:   BDRAM_SP
//   Bits:     32
//   Mux:      8
//   ladhdal:  sdj
//   zdfjhael: apfiehad
     slhgslfkghlkj
     slgdhlgfdkkdf
     Dataoutstage: None;
     TransparentMode: None;
     CellName: BDRAM_SP;
MemoryTemplate(BDRAM_SP)
{
 afljefkaf
 aslhkldfjfa
 fihhfejksgj
 dfhdhsgjshgf
 zdkjjgshgf
 sjfhfjkh
 sfdkjssjfh

Eu preciso extrair os números 32 e 8 e, em seguida, calcular o resultado de

sum=b * (0.004+(c * 0.00008));

em que b=32 e c=4 .

O resultado deve ser gravado no arquivo como Result: sum; .

Como posso conseguir isso?

    
por shri 13.07.2016 / 13:24

1 resposta

4

Você pode usar o seguinte perl script :

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

foreach my$file (@ARGV)
{
    open(IN,'<',$file) or die $!;
    open(OUT,'>',$file.".result") or die $!;
    my$b;
    my$c;
    my$sum;
  while(<IN>)
  {
      ($b)=$_=~/(\d+)/ if $_=~/Bits/;
      ($c)=$_=~/(\d+)/ if $_=~/Mux/;
      print OUT $_;
  }
  print STDERR "found values in ",$file,":\n";
  print STDERR "Bits: ",$b,"\nMux: ",$c,"\n";

    $sum=$b * (0.004+($c * 0.00008));
    print STDERR "writing sum (",$sum,") to the output ",$file,".result\n";
    print OUT "Result: ",$sum,";\n";

    close OUT or die $!;
    close IN or die $!;
}

Ele procura no arquivo de entrada pelas cadeias Bits e Mux , extrai os números a seguir e imprime o resultado da equação ( $sum=$b * (0.004+($c * 0.00008)) ) no arquivo de saída como %código%. O arquivo de saída é nomeado como Result: <number>; .

Executando no seu arquivo de exemplo:

$ perl myscript.pl file.txt
found values in file.txt:
Bits: 32
Mux: 8
writing sum (0.14848) to the output file.txt.result

O conteúdo de input-file.result :

//   copyright kkshlglkf
//   lhafslghldk
//   rsghlgsrlskl
//   sgkg
//   sgrjgrs
//   Memory:   BDRAM_SP
//   Bits:     32
//   Mux:      8
//   ladhdal:  sdj
//   zdfjhael: apfiehad
     slhgslfkghlkj
     slgdhlgfdkkdf
     Dataoutstage: None;
     TransparentMode: None;
     CellName: BDRAM_SP;
MemoryTemplate(BDRAM_SP)
{
 afljefkaf
 aslhkldfjfa
 fihhfejksgj
 dfhdhsgjshgf
 zdkjjgshgf
 sjfhfjkh
 sfdkjssjfh
Result: 0.14848;

Se você quiser usar o script com vários arquivos de entrada, poderá executá-lo como

perl myscript.pl file1 file2 file3 ...

Isso criará os arquivos de saída file.txt.result , file1.result e assim por diante

    
por Wayne_Yux 13.07.2016 / 13:38