@BlackJack:
Ich weiss, dass ein Update ueberfaellig ist Ich sitze aber an einem Rechner der Uni und da kann ich nicht sehr viel an der Software aendern. Zu Hause sollte es dann klappen
Zeile aus mehreren Dateien in eine neue Datei kopieren
Falls es jemanden noch interessieren koennte:
Es gibt da soetwas schoenes wie 'grep' habe ich als shell-skript laufen lassen
Damit durchsucht man alle Dateien, die mit "results" enden nach tmin (grep tmin $file | awk '{print $2}') wobei in der Originaldatei tmin = 123456 steht. mit awk nimmt man sich 123456 heraus. Anschliessend kann man mit > outputfile.txt alle in eine Datei reinschreiben.
Liebe Gruesse
Sia
Es gibt da soetwas schoenes wie 'grep' habe ich als shell-skript laufen lassen
Code: Alles auswählen
for file in `ls *results`
do
tmin=`grep tmin $file | awk '{print $2}'`
tmax=`grep tmax $file | awk '{print $2}'`
Integral=`grep \^Integral $file | awk '{print $2}'`
dIntegral=`grep -P 'dIntegral\t' $file | awk '{print $2}'`
t=`echo \($tmin+$tmax\)/2 | bc`
echo $t $Integral $dIntegral
done
Liebe Gruesse
Sia
Zuletzt geändert von Anonymous am Freitag 7. Februar 2014, 18:46, insgesamt 1-mal geändert.
Grund: Quelltext in Bash-Code-Tags gesetzt.
Grund: Quelltext in Bash-Code-Tags gesetzt.
@sia: Kleine Maneuverkritik:
Die Backticks ` sind nicht besonders gut lesbar und verschachteln kann man sie auch nicht. Stattdessen würde ich die äquivalente $(…)-Syntax verwenden. Weiterer Pluspunkt: man kann ``$(…)`` direkt in "-Zeichenketten verwenden.
Über ``$(ls pattern)`` zu iterieren ist falsch. Sowie in den Dateinamen irgendwas ”komisches” vorkommt fällt man damit auf die Nase. Korrekt wäre es ganz einfach nur das Muster zu verwenden, also in Deinem Fall ``for file in *results``.
Ebenfalls wegen möglicher Sonderzeichen, da fallen auch schon ansonsten harmlose Leerzeichen drunter, sollte man immer wenn man ``$file`` verwendet doppelte Anführungszeichen setzen, damit das auch ganz sicher nur *ein* Argument ist.
Wenn bei ``bc`` die Nachkommestallen gar nicht benutzt werden und das ganze am ende in einer Bash läuft, kann man `$t` auch die Shell ausrechnen lassen. Da kommt bei mir am Ende das hier heraus (ungetestet):
Was hier aber immer noch nahezu ein Verbrechen ist: Jede Datei wird *vier* mal komplett von Anfang bis Ende nach jeweils einem Wert durchsucht und jedes mal wird ``awk`` auf eine Zeile angewendet, nur um das Feld aus der Zeile zu extrahieren. Wenn man sowieso schon AWK als Abhängigkeit hat, kann man *das* auch gleich verwenden um das gesamte Problem zu lösen. Genau für solche Aufgaben ist es ja gedacht. Ungetestet:
Ich habe einfach mal die regulären Ausdrücke aus dem Shell-Skript übernommen, da würde man hier vielleicht etwas spezifischere Tests auf Feldwerte machen wollen.
Die Backticks ` sind nicht besonders gut lesbar und verschachteln kann man sie auch nicht. Stattdessen würde ich die äquivalente $(…)-Syntax verwenden. Weiterer Pluspunkt: man kann ``$(…)`` direkt in "-Zeichenketten verwenden.
Über ``$(ls pattern)`` zu iterieren ist falsch. Sowie in den Dateinamen irgendwas ”komisches” vorkommt fällt man damit auf die Nase. Korrekt wäre es ganz einfach nur das Muster zu verwenden, also in Deinem Fall ``for file in *results``.
Ebenfalls wegen möglicher Sonderzeichen, da fallen auch schon ansonsten harmlose Leerzeichen drunter, sollte man immer wenn man ``$file`` verwendet doppelte Anführungszeichen setzen, damit das auch ganz sicher nur *ein* Argument ist.
Wenn bei ``bc`` die Nachkommestallen gar nicht benutzt werden und das ganze am ende in einer Bash läuft, kann man `$t` auch die Shell ausrechnen lassen. Da kommt bei mir am Ende das hier heraus (ungetestet):
Code: Alles auswählen
#!/usr/bin/bash
for file in *results
do
tmin=$(grep 'tmin' "$file" | awk '{print $2}')
tmax=$(grep 'tmax' "$file" | awk '{print $2}')
Integral=$(grep '\^Integral' "$file" | awk '{print $2}')
dIntegral=$(grep -P 'dIntegral\t' "$file" | awk '{print $2}')
t=$(echo "($tmin + $tmax) / 2" | bc)
# alternativ in Bash:
# t=$((($tmin + $tmax) / 2))
echo "$t $Integral $dIntegral"
done
Code: Alles auswählen
#!/usr/bin/env awk
/tmin/ { tmin = $2 }
/tmax/ { tmax = $2 }
/^Integral/ { integral = $2 }
/dIntegral\t/ { d_integral = $2 }
END { print (tmin + tmax) / 2, integral, d_integral }