1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Umgang mit AWK im BASH-skript

Dieses Thema im Forum "Unix & Terminal" wurde erstellt von paperbag, 19.06.09.

  1. paperbag

    paperbag Golden Delicious

    Dabei seit:
    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.
     
  2. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    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".
     
  3. paperbag

    paperbag Golden Delicious

    Dabei seit:
    19.06.09
    Beiträge:
    7
    sehr fein, danke - genau das hab ich gesucht

    bis zum nächsten mal
     
  4. paperbag

    paperbag Golden Delicious

    Dabei seit:
    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
     
    #4 paperbag, 19.06.09
    Zuletzt bearbeitet: 19.06.09
  5. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    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 ) 
    
     
  6. paperbag

    paperbag Golden Delicious

    Dabei seit:
    19.06.09
    Beiträge:
    7
    spitze! danke, du hast mir wirklich sehr geholfen!

    das wars jetz denk ich, bis bald
     
  7. paperbag

    paperbag Golden Delicious

    Dabei seit:
    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?
     
  8. paperbag

    paperbag Golden Delicious

    Dabei seit:
    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
     
    #8 paperbag, 21.06.09
    Zuletzt bearbeitet: 21.06.09
  9. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    ...wäre als "des Teufels allerletzte Fliege in der Not" auch das hier gut:
    Code:
    echo Text,Text | tr , .
    [COLOR="Blue"]Text.Text[/COLOR]
    :)
     
  10. paperbag

    paperbag Golden Delicious

    Dabei seit:
    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
     
    #10 paperbag, 22.06.09
    Zuletzt bearbeitet: 22.06.09
  11. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    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
    
     

Diese Seite empfehlen