awk - Variablen aus $ fix speichern?

P

Palima

Grünschnabel
Servus

ich muss derzeit ein Skript schreiben und benutze zum ersten mal awk ... nun irgendwie komm ich nicht weiter ... hoffe ihr könnt mir helfen

ich soll mein skript dermassen ausführen:

grades.sh 50 65 75 85 100 < Beispiel.txt

wobei ich die argumente gerne fix gespeichert hätte, weil ich sie zur Auswertung brauche ...

wenn ich aber einfach sage

x= $1

dann merkt er sich das nur solange bis ich die Beispiel.txt mit getline einlese ... dann werden die inhalte überschrieben

gibts ne möglichkeit die zu behalten?


vielen dank im voraus
Christoph

PS: hier der Code

awk "BEGIN { ns[1]= $1; #print ns1
ns2 = $2; #print ns2
ns3 = $3; #print ns3
ns4 = $4; #print ns4
ns5 = $5; #print ns5

}"


awk '{
x1=x2=x3=x4=x5=0;
do {
#print tmp;
if($5<= 100 && $5 > 85) {x1++}
if($5< 85 && $5 >=75) {x2++}
if($5< 75 && $5 >=65) {x3++}
if($5< 65 && $5 >=50) {x4++}
if($5< 50 && $5 >=0) {x5++}
#print $5;
SUMStudent = NR
} while (getline != 0)
print "Anzahl der Studenten: \t" SUMStudent;
av1 = x1/SUMStudent *100;
av2 = x2/SUMStudent *100;
av3 = x3/SUMStudent *100;
av4 = x4/SUMStudent *100;
av5 = x5/SUMStudent *100;111
print "Notenskala \t Note \tAnzahl \tAnteil"
print "85 - 100 \t 1 \t" x1 "\t" av1 "%"
print "75 - 85 \t 2 \t" x2 "\t" av2 "%"
print "65 - 75 \t 3 \t" x3 "\t" av3 "%"
print "50 - 65 \t 4 \t" x4 "\t" av4 "%"
print "<50 \t\t 5 \t" x5 "\t" av5 "%"



}'
ich möchte nun die Argumente ns1 bis ns5 auch in der zweiten awk-Anweisung verwenden können ... wie könnte das gehen?
 
Zuletzt bearbeitet:
Da awk jeweils eine neue Instanz öffnet, kannst Du logischerweise nicht gemeinsame Variablen nutzen. Du kannst aber die Variablen durch die Shell übergeben:

Code:
[~]$ params=$(echo 'a b c' | awk '{print "ns1="$1" ns2="$2" ns3="$3}')
[~]$ echo huhu | awk '{print "ns1="ns1" ns2="ns2" ns3="ns3}' $params
ns1=a ns2=b ns3=c

Gruss, Xanti
 
danke für die Hilfe - gute Idee

ginge es auch mit einem awk-Aufruf? oder muss ich zwei machen? -
hab noch keine andere Möglichkeit gefunden mit der vorgegebenen Ausführungsart sowohl die Argumente als auch das file in der Weise zu übergeben ...

salut
Palima
 
Vielleicht geht folgendes:

grades.sh:
Code:
awk '{...}' ns1=$1 ns2=$2 ns3=$3 ns4=$4 ns5=$5

Code:
./grades.sh 50 65 75 85 100 < Beispiel.txt

Gruss, Xanti
 
Zuletzt bearbeitet:
So bin endlich dazu gekommen deine Vorschläge auszuprobieren ...

also beim ersten weiss ich nicht ob du mich richtig verstanden hast, oder ich es einfach falsch mache ...

denn was ich will ist das die Argumente von grades.sh - dh die Werte 50,60, ... usw also die Felder $1 bis $5 als Variable übergeben werden ...

im zweiten awk Aufruf stehen die derzeit als Zahlenwerte ja drinnen, aber ich möchte sie beim Aufruf übergeben lassen ...

das zweite hat bei mir gar nicht geklappt ... da bekomm ich syntax error ...
hm mach ich da was falsch??

danke für deine hilfe soweit
Palima
 
Langsam bin ich richtig verwirrt. ;)

Ich fasse nochmal zusammen: Du hast die Argumente, die in ns gespeichert werden sollen, bereits bei Aufruf des Shellskriptes zur Verfügung? Wenn ja, dann rufst Du einfach das Skript mittels

Code:
./grades.sh 50 65 75 85 100 < Beispiel.txt

auf. In das Skript schreibst Du Deine zweite awk-Anweisung:

Code:
awk '{
x1=x2=x3=x4=x5=0;
do {
#print tmp;
if($5<= 100 && $5 > 85) {x1++}
if($5< 85 && $5 >=75) {x2++}
if($5< 75 && $5 >=65) {x3++}
if($5< 65 && $5 >=50) {x4++}
if($5< 50 && $5 >=0) {x5++}
#print $5;
SUMStudent = NR
} while (getline != 0)
print "Anzahl der Studenten: \t" SUMStudent;
av1 = x1/SUMStudent *100;
av2 = x2/SUMStudent *100;
av3 = x3/SUMStudent *100;
av4 = x4/SUMStudent *100;
av5 = x5/SUMStudent *100;111
print "Notenskala \t Note \tAnzahl \tAnteil"
print "85 - 100 \t 1 \t" x1 "\t" av1 "%"
print "75 - 85 \t 2 \t" x2 "\t" av2 "%"
print "65 - 75 \t 3 \t" x3 "\t" av3 "%"
print "50 - 65 \t 4 \t" x4 "\t" av4 "%"
print "<50 \t\t 5 \t" x5 "\t" av5 "%"
}' ns1=$1 ns2=$2 ns3=$3 ns4=$4 ns5=$5

Die erste awk-Anweisung lässt Du weg. Beachte die ns1=$1 ns2=$2 ns3=$3 ns4=$4 ns5=$5 nach der awk-Anweisung, damit werden die ns erstellt und übergeben.

Gruss, Xanti

edit: Bin ich blind? Ich sehe nirgendswo die Verwendung von den ns-Variablen in deinem zweiten awk.
 
Zuletzt bearbeitet:
servus

danke für deine bemühungen ... hab es hinbekommen

als die ns-Variablen wären statt den ausgeschriebenen Werten 50,65, ... usw gewesen ...

ich habe sie jetzt als einfache bash-Variablen gespeichert und übergeben ... das ganze hat aber nie funktioniert, weil die bash-Variablen von den awk-Variablen überschrieben wurden dh die $1,$2, usw haben sich mit übergabe des .txt natürlich geändert... mein problem war also, das ich bash-Varible innerhalb von awk mit $ns auslesen wollte, statt mit '$ns' und das funkte nicht .... eigentlich haben mir also nur ' gefehlt ... aber als sporadischer shell-nutzer der ich bin, ist mir die quoterei etwas fremd

naja - danke trotzdem
& die schönen tage wünsch ich
Palima
 

Ähnliche Themen

awk: warum gibt close -1 zurück ?

skript zum löschen doppelter dateien

NagiosGrapher 1.7.1 funktioniert nicht

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

Variableninhalt wird nicht gespeichert

Zurück
Oben