Zeile aus mehreren Dateien in eine neue Datei kopieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sia
User
Beiträge: 11
Registriert: Freitag 31. Januar 2014, 14:05

@BlackJack:
Ich weiss, dass ein Update ueberfaellig ist :D 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 :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du könntest dort eine aktuelle Version in deinem Benutzerverzeichnis kompilieren.
Das Leben ist wie ein Tennisball.
sia
User
Beiträge: 11
Registriert: Freitag 31. Januar 2014, 14:05

@EyDu: Danke.


@Alle: Das Problem ist jetzt mit einem Shell-Skript geloest worden! :D
sia
User
Beiträge: 11
Registriert: Freitag 31. Januar 2014, 14:05

Falls es jemanden noch interessieren koennte:

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
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
Zuletzt geändert von Anonymous am Freitag 7. Februar 2014, 18:46, insgesamt 1-mal geändert.
Grund: Quelltext in Bash-Code-Tags gesetzt.
BlackJack

@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):

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
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:

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 }
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.
sia
User
Beiträge: 11
Registriert: Freitag 31. Januar 2014, 14:05

@BlackJack

Danke fuer die kleinen Tipps. So lernt man immer weiter :)

Lieben Gruss

Sia
Antworten