• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Umgang mit AWK im BASH-skript

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
Hallo,

ich habe folgendes Problem:

ich hole mir per AWK 2 Spalten (1. und 3.) aus einer Input-datei (n x n - matrix) und speichere diese dann in die output-datei (n x 2 - matrix):

Code:
awk '{printf "%g %g \n", $1, $3}' <input.txt >out.txt
das funktioniert soweit.

Ich möchte nun aber dieses AWK-Programm in ein bash-skript einbauen, wo ich per FOR-schleife die 2. Spalte, welche von input.txt genommen wird, variieren kann.
Ich dachte dabei an ARGV vom awk, etwa so:

Code:
for i in 3 6 10
do    
    awk '{printf "%g %g \n", $1, $ARGV[3]}' <input.txt >out.txt $i
     ...
done
natürlich muss ich dann auch die output-file anpassen, da sie sonst jedes mal überspeichert wird, aber das ist eine andere geschichte ;)

irgend etwas in der richtung bräuchte ich...

weiß da jemand weiter?

danke, schönen tag, stefan.
 

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
Ich dachte dabei an ARGV vom awk, etwa so:
Code:
for i in 3 6 10
do    
    awk '{printf "%g %g \n", $1, $ARGV[[COLOR="Red"]3[/COLOR]]}' [COLOR="Red"]<input.txt >out.txt[/COLOR] $i
     ...
done
Erstens: Shell-Umleitungen sind keine Argumente und werden daher auch nicht als solche gezählt. (Sie werden an das aufgerufene Kommando gar nicht übermittelt).
Du solltest sie auch nicht einfach mittenrein in ein Kommando setzen. bash akzeptiert das, andere Shells fressen das u.U. nicht.
Zweitens: Rufe doch einfach awk gleich mit dem gewünschten Parameter auf:
Code:
for ITEM in NUMBERS; do
    awk '{printf "%g %g \n", $1, $'$ITEM' }' <infile >outfile
done
Oder machs dir einfach und benutze für solche simplen Jobs das sehr viel schlankere "cut".
 

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
Zweitens: Rufe doch einfach awk gleich mit dem gewünschten Parameter auf:
Code:
for ITEM in NUMBERS; do
    awk '{printf "%g %g \n", $1, $'$ITEM' }' <infile >outfile
done

sehr fein, danke - genau das hab ich gesucht

bis zum nächsten mal
 

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
hallo, ich steh schon wieder vor dem nächsten problem:


Code:
for i in 2 3 4 
do    
    (let) ANGLE=21.875+3.75*$i
    ./test $ANGLE
done
wie kann ich diese Zahl ANGLE an das Programm übergeben, wenn ich das ganze (ohne let) übergebe wandelt mir die FUnktion 'atof' (im c-programm) den string nur in 21.875 um und schmeisst den rest weg

hat da jemand eine idee?

danke, stefan
 
Zuletzt bearbeitet:

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
man bash:
ARITHMETIC EVALUATION
The shell allows arithmetic expressions to be evaluated,
under certain circumstances (see the let and declare
builtin commands and Arithmetic Expansion).
Evaluation is done in fixed-width
integers with
no check for overflow, though division by 0 is
trapped and flagged as an error.
...

Lösung: Externes Programm verwenden.
Code:
ANGLE=$( echo "21.875 + 3.75 * $i" | bc )
 

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
spitze! danke, du hast mir wirklich sehr geholfen!

das wars jetz denk ich, bis bald
 

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
alle guten dinge sind drei:

ich versuche ja so eine Spalte auszulesen:

Code:
for ITEM in NUMBERS; do
    awk '{printf "%g %g \n", $1, $'$ITEM' }' <infile >outfile
done

nun lest AWK ja nur integer aus und ich schaffs wieder mal nicht das ganze als floats auszulesen und anderes Problem ergibt sich vermutlich, weil AWK die Zahln mit Komma ',' ausgibt, ich habe nämlich folgendes versucht:

Code:
for ITEM in NUMBERS; do
    awk '{printf "%.5e %.5e \n", $1, $'$ITEM' }' <infile >outfile
done

und das ergebnis war:

0,0000e+00 7,0000e+00
1,0000e+00 7,0000e+00
2,0000e+00 6,0000e+00
3,0000e+00 6,0000e+00
4,0000e+00 5,0000e+00
5,0000e+00 5,0000e+00
6,0000e+00 5,0000e+00
7,0000e+00 5,0000e+00
8,0000e+00 4,0000e+00
9,0000e+00 4,0000e+00


wenn ich diese Werte in C verwenden möchte muss ich das nochmal umwandeln auf x.xxx, oder was denkt ihr?
 

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
ok, ich habe jetzt herausgefunden, dass AWK nur zahlen mit "," bearbeiten kann, dazu meine neue frage:

gibt es da eine printf-option, dass ich die Zahlen im Format:

xx.xxxx

ausgeben kann?

danke


EDIT:

ich hab auch hier auf meine vorschnelle frage was gefunden, sorry:


um die Ausgabe mit Punkt zu erziehlen:
Code:
export LC_ALL=C
 
Zuletzt bearbeitet:

paperbag

Golden Delicious
Registriert
19.06.09
Beiträge
7
hehe, wäre auch eine Fliege, ja ;)

ich hätte da noch eine Schönheitsfrage:

mein skript erzeugt zur Zeit bei jedem Schleifendurchgang eine neue datei. Nun hab ich nach einer Lsg. gesucht, wo mir AWK bei jedem Schleifendurchlauf das "Ergebnis" (das ist die 2. Spalte des outfiles) als Spalte im outfile anhängt, quasi: const=spalte1 erg1=spalte2, erg2=spalte3, ...

gibt es dazu eine Idee?

danke nochmals
 
Zuletzt bearbeitet:

Rastafari

deaktivierter Benutzer
Registriert
10.03.05
Beiträge
18.150
im outfile anhängt
Write to File:
Code:
command [COLOR="Blue"]>[/COLOR] file
Append to File:
Code:
command [COLOR="Blue"]>>[/COLOR] file
Falls du dazu einen Zeilenumbruch am Ende mal unterdrücken musst, kannst du das Ergebnis zwischenspeichern und über ein:
Code:
echo [COLOR="Blue"]-n[/COLOR] "$variable" >> file
ausgeben. Für Spaltenanordnung kannst du stattdessen einen Tab so einfügen:
Code:
echo [COLOR="Blue"]-ne[/COLOR] "[COLOR="Blue"]\t[/COLOR]$variable" >> file