[AWK/Shell]Variabele binnen AWK doorgeven binnen shellscript

Pagina: 1
Acties:

  • Mateyo
  • Registratie: Juli 2001
  • Niet online
Ik vraag mij hoe ik een variabele binnen AWK door kan geven naar een ander AWK script cq. de variabele binnen het shellscript bekend maken.
Een klein stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Hiervoor wordt een lijst geproduceerd met 2 kolommen: 
kolom 1 met een cijfer, kolom met een letter. 
Deze lijst wordt gepiped naar de volgende code:

awk '{if (FNR==1)  {
        max=$1
      }
      print $2 " " $1}
      END {print max}' |
sort |
awk '{if (FNR==1)  {
        max=$0
      }
      else  {
        if ($2==max)  {
          lengte=60
          }
        else  {
          lengte=int($2/max*60)
    }
        balkje=""
        for (i=1; i<=lengte; i++)  {
          balkje=balkje "*"
        }
        print $1 " " balkje
      }


Ik zou dus graag willen dat de variabele max binnen het eerste AWK-gedeelte ook bekend is binnen het laatste AWK-gedeelte. Nu doe ik dit door de variabele gewoon te printen. Kan je met AWK bijvoorbeeld max exporteren naar een Environment-variabele?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
In NOS heb je stukken meer kans op een antwoord ;)
P&W -> NOW

  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:50
Just wondering...maar wat moet die code nou eigenlijk precies doen? Ik kan er niet echt wijs uit worden...

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 20:59

odysseus

Debian GNU/Linux Sid

Dat is nogal lastig, omdat een programma denk ik niet zomaar iets in de environment van zijn parent kan wijzigen...als awk nu een built-in was van bash, dan zou het eenvoudiger geweest zijn :). Is een constructie als het volgende iets waar je wat aan hebt?
code:
1
awk_code | SHELL_VAR = $? | awk_code_met_var

Je moet dan zorgen dat je de awk-code af laat sluiten met een errorstatus die de waarde van $max heeft. Het enige nadeel hieraan is dat je geen $max kan hebben van >255...als je dat wel wilt, dan moet er iemand even een nettere oplossing verzinnen :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • Mateyo
  • Registratie: Juli 2001
  • Niet online
Wilke schreef op 11 May 2003 @ 15:29:
Just wondering...maar wat moet die code nou eigenlijk precies doen? Ik kan er niet echt wijs uit worden...
Deze code, althans de complete code, maakt een histogram op basis van de frequentie van iedere letter in het alfabet in een textfile. De lengte van ieder balkje in het histogram is maximaal 60 sterretjes voor de meest voorkomende letter. De rest van de balkjes is relatief hieraan. Een voorbeeldje:

code:
1
2
3
4
5
6
a ********************
b ****
c **********
.
.
z ***************

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 20:59

odysseus

Debian GNU/Linux Sid

De volgende implementatie komt uit de Perl-manual, misschien is dit handiger:
Perl:
1
2
3
4
5
#!/usr/bin/perl
$x = "Dit is een tekst";
$x =~ s/(.)/$chars{$1}++;$1/eg;
print "frequency of '$_' is $chars{$_}\n"
foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);

Je moet dan alleen niet direct printen, maar gewoon de hash doorlopen op zoek naar de hoogste frequentie. Vervolgens reken je de rest uit relatief ten opzichte van die hoogste frequentie en dan kun je heel makkelijk het goede aantal sterretjes tekenen :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • Mateyo
  • Registratie: Juli 2001
  • Niet online
odysseus schreef op 11 May 2003 @ 22:03:
De volgende implementatie komt uit de Perl-manual, misschien is dit handiger:
Perl:
1
2
3
4
5
#!/usr/bin/perl
$x = "Dit is een tekst";
$x =~ s/(.)/$chars{$1}++;$1/eg;
print "frequency of '$_' is $chars{$_}\n"
foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);

Je moet dan alleen niet direct printen, maar gewoon de hash doorlopen op zoek naar de hoogste frequentie. Vervolgens reken je de rest uit relatief ten opzichte van die hoogste frequentie en dan kun je heel makkelijk het goede aantal sterretjes tekenen :).
Mag alleen Shell-commando's en AWK gebruiken...

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Dat kan wel.

Ik ga er van uit dat je het 2e script aanroept binnen het eerste script.

Roep het 2 schript gewoon aan : ./script2 $variable_die_je_mee_wil_geven

En dan in het 2e awk script kan je met de variable ARGV[N] (N nummer van de variable)
de waarde van devariable die je meegaf weer opvragen :).

succes
Pagina: 1