Bash-Script rel. langam: aus Wertetabelle Differenzwert-Tabelle erzeugen

Im Unterforum Hardware, Betriebssysteme, Programmiersprachen - Beschreibung: Alles zu Software, Hardware, Windows, Linux, Programmiersprachen
Anfragen zu Modding, Games, Cracks, etc. unerwünscht.

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 06 11 2024  11:18:28      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Hardware, Betriebssysteme, Programmiersprachen        Hardware, Betriebssysteme, Programmiersprachen : Alles zu Software, Hardware, Windows, Linux, Programmiersprachen
Anfragen zu Modding, Games, Cracks, etc. unerwünscht.

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
Bash-Script rel. langam: aus Wertetabelle Differenzwert-Tabelle erzeugen

    







BID = 654772

Bartholomew

Inventar



Beiträge: 4681
 

  


Hoi,

Mein Mitbewohner (angehender Diplomgeologe) soll auf Wunsch seiner Betreuerin eine Temperaturkarte in eine Temperaturdifferenzkarte (benachbarte Felder) umwandeln.

So in etwa sieht die Rohdatei aus:
http://www.climatesource.com/format/arc_asciigrid.html


Code :

ncols         354

nrows 1486
xllcorner 724410
yllcorner 3428070
cellsize 60
NODATA_value -9999
34,60541 36,89227 40,25235 38,02142 36,32416 35,18079 36,32416 35,75369 36,89227 38,02142 39,14136 38,02142 35,75369 35,18079 36,89227 36,89227 35,75369 35,18079 36,32416 38,02142 38,02142 39,69797 39,69797 39,69797 39,69797 39,69797 39,69797 40,25235 40,25235 40,25235 40,80457 40,80457 41,35461 41,35461 40,25235 40,25235 38,58252 37,45801 39,14136 37,45801 36,32416 36,32416 38,58252 38,02142 38,58252 40,25235 41,35461 41,90256 41,35461 41,35461 40,80457 39,14136 38,02142 42,44836 41,90256 40,25235 39,14136 38,02142 40,80457 40,25235 38,58252 39,69797 39,69797 40,25235 39,69797 38,58252 36,89227 38,02142 41,35461 42,9921 42,44836 41,35461 40,80457 40,80457 39,69797 38,58252 39,14136 41,35461 43,53381 43,53381 41,35461 39,69797 39,69797 39,14136 39,69797 40,25235 41,90256 41,90256 42,44836 38,58252 37,45801 35,18079 35,18079 35,18079 38,02142 35,75369 35,18079 36,89227 38,02142 39,14136 39,14136 38,02142 37,45801 37,45801 38,58252 37,45801 36,89227 38,02142 38,58252 35,75369 36,32416 38,02142 37,45801 38,02142 38,02142 38,02142 36,89227 38,02142 39,69797 38,58252 36,89227 36,32416 36,32416 38,58252 41,35461 41,35461 40,80457 40,80457 40,25235 40,25235 39,69797 39,69797 40,25235 40,80457 41,35461 41,35461 41,90256 42,44836 42,44836 40,80457 40,25235 40,25235 40,25235 40,25235 40,80457 40,80457 41,90256 41,90256 41,90256 41,90256 42,44836 42,44836 41,90256 40,25235 40,80457 41,90256 42,44836 42,44836 42,44836 42,9921 42,44836 41,90256 41,90256 41,35461 41,90256 42,44836 41,35461 40,80457 38,58252 39,14136 40,25235 41,35461 41,90256 40,80457 40,80457 40,25235 40,25235 41,35461 41,35461 40,80457 38,02142 34,60541 32,86429 33,44724 34,02759 34,60541 34,60541 35,18079 36,32416 37,45801 36,32416 34,60541 33,44724 35,75369 38,02142 38,58252 38,58252 39,14136 39,69797 39,69797 40,80457 40,25235 40,80457 41,35461 41,35461 41,35461 40,25235 38,58252 37,45801 37,45801 36,89227 36,89227 36,89227 39,14136 41,90256 42,44836 39,14136 35,18079 33,44724 33,44724 38,02142 44,61115 45,68057 45,68057 45,68057 45,14685 44,61115 45,14685 45,68057 45,68057 46,21234 45,68057 46,21234 46,21234 45,68057 46,21234 45,68057 45,68057 45,14685 45,14685 45,68057 45,14685 45,14685 45,68057 45,68057 46,21234 46,74222 46,21234 46,74222 47,2702 46,74222 47,2702 47,2702 47,2702 47,2702 46,21234 46,21234 47,2702 47,2702 46,74222 47,2702 47,2702 47,2702 47,2702 47,2702 47,2702 46,21234 45,14685 45,68057 45,68057 44,61115 44,61115 45,14685 45,14685 45,68057 46,21234 47,2702 46,74222 46,21234 47,2702 48,32062 48,32062 48,84305 48,84305 49,36371 49,36371 49,36371 49,88257 49,88257 49,36371 48,84305 48,32062 47,2702 46,74222 46,74222 45,68057 42,9921 40,80457 42,9921 44,61115 44,07349 44,61115 45,68057 45,14685 45,11304 45,10184 46,73199 46,7663 46,79138 45,73087 46,24643 47,2702 47,79633 48,32062 47,79633 47,79633 46,74222 44,07349 41,90256 40,80457 40,80457 41,35461 40,80457 40,80457 41,35461 41,90256 41,35461 40,25235 40,25235 41,35461 40,80457 39,69797 40,25235 41,90256 41,90256 41,35461 41,35461 40,80457 41,90256 42,9921 42,44836 42,9921 42,9921 43,53381 42,9921 42,9921 43,53381 42,9921 41,90256 41,35461 42,44836 42,9921 41,90256 44,07349
35,75369 39,14136 40,80457 38,02142 37,45801 38,02142 39,14136 38,58252 39,69797 38,58252 36,89227 34,60541 34,02759 36,32416 38,02142 35,75369 34,60541 34,60541 37,45801 38,58252 39,14136 39,69797 39,69797 39,69797 40,25235 39,69797 40,25235 40,25235 39,69797 39,69797 40,25235 40,25235 39,69797 40,80457 40,80457 39,14136 36,89227 39,69797 39,14136 35,75369 35,75369 36,89227 38,02142 37,45801 39,14136 38,02142 38,02142 39,14136 38,58252 38,02142 37,45801 38,02142 40,25235 42,44836 42,44836 39,14136 38,02142 41,35461 42,9921 39,69797 39,69797 39,69797 41,35461 41,90256 39,69797 37,45801 36,32416 39,69797 40,25235 40,80457 41,35461 40,25235 40,80457 40,80457 39,14136 38,58252 39,14136 41,90256 43,53381 42,9921 40,25235 39,69797 39,69797 39,14136 39,14136 40,25235 39,69797 39,14136 39,69797 36,89227 35,18079 34,02759 34,60541 35,18079 38,58252 36,89227 37,45801 38,02142 38,58252 38,58252 39,14136 39,14136 39,14136 38,58252 39,69797 39,14136 38,02142 37,45801 37,45801 35,75369 36,89227 37,45801 38,02142 39,14136 39,14136 38,58252 39,14136 40,80457 40,25235 38,02142 37,45801 39,69797 39,69797 39,69797 41,90256 41,90256 41,90256 41,35461 40,80457 40,25235 39,69797 40,25235 40,80457 40,80457 40,80457 41,35461 42,44836 41,90256 41,35461 40,25235 39,69797 39,69797 40,25235 40,25235 40,25235 40,80457 41,35461 41,90256 41,90256 41,90256 41,90256 41,90256 41,35461 40,80457 42,44836 42,9921 42,9921 42,9921 42,9921 43,53381 43,53381 42,9921 42,44836 42,9921 42,44836 41,90256 41,35461 40,80457 39,14136 39,69797 40,25235 40,80457 41,90256 41,35461 40,80457 40,25235 40,80457 41,35461 40,25235 36,89227 34,60541 33,44724 33,44724 32,86429 35,75369 36,89227 35,75369 35,75369 36,89227 37,45801 38,02142 37,45801 36,89227 38,02142 39,14136 39,69797 40,25235 39,14136 38,58252 39,14136 39,14136 38,58252 39,69797 40,80457 41,90256 40,80457 40,80457 40,25235 39,14136 40,25235 40,80457 40,25235 39,69797 41,90256 40,80457 38,02142 33,44724 30,50635 30,50635 30,50635 32,27881 39,14136 44,07349 45,14685 45,68057 45,68057 45,68057 46,21234 47,2702 47,2702 46,74222 46,21234 46,21234 46,21234 46,21234 45,68057 45,14685 44,61115 44,07349 44,61115 45,14685 45,14685 45,14685 45,68057 45,68057 46,21234 46,21234 45,68057 45,68057 45,14685 44,61115 45,68057 46,21234 46,74222 46,74222 46,21234 46,21234 46,21234 46,74222 46,21234 46,21234 46,21234 46,74222 46,74222 47,2702 46,74222 45,68057 44,61115 45,68057 45,68057 45,68057 45,68057 45,14685 44,61115 44,61115 45,68057 46,74222 46,74222 47,2702 47,79633 48,32062 48,32062 48,84305 48,84305 48,84305 48,84305 48,84305 48,84305 49,36371 48,84305 48,84305 48,84305 48,32062 47,79633 47,2702 46,21234 44,61115 41,90256 42,44836 46,21234 45,68057 45,14685 46,21234 45,68057 44,61115 45,14685 46,74222 47,2702 47,2702 45,68057 46,24677 47,3035 47,87109 48,29886 47,65759 47,06934 45,599 43,57864 42,44836 41,90256 40,25235 40,25235 40,80457 41,35461 42,44836 42,44836 41,35461 39,69797 38,58252 39,69797 40,80457 40,25235 40,25235 40,80457 40,25235 42,44836 42,44836 41,90256 42,44836 42,44836 42,44836 43,53381 43,53381 42,44836 41,90256 41,90256 42,9921 41,90256 41,90256 41,35461 41,90256 44,07349 41,35461 43,53381
...



Ich habe jetzt ein Bash-Script geschrieben, dass mir schon mal eine neue Tabelle erstellt, die die horizontalen Temperaturdifferenzen enthält:



Code :

#!/bin/bash

# hdiff.sh
# Erstellt eine Tabelle mit horizontalen Temperatur-Differenzen.

if [ -n "$1" ] # If command-line argument present,
then #+ then set start-string to it.
str0="$1"
else # Fehlermeldung:
echo "Input-Datei angeben!"
exit 1
fi

# Zeilen und Spalten aus Quelltabelle auslesen:
NCOLS=$( <$1 grep ncols | sed -e 's/[^0-9]//g' )
NROWS=$( <$1 grep nrows | sed -e 's/[^0-9]//g' )

#((SNR3=$SNR2+1))

ZNR=7 # aktuelle Zeile Nr.
SNR=1 # akutelle Spalte Nr.
SNR_MAX=$NCOLS # Abbbruch-Bedingung
#SNR_MAX=10
DIFFLINE="" # String mit den Differenztemperaturen
ZEILE=$( <$1 head -n $ZNR | tail -n 1 ) # eine ausgelesene Zeile aus der Tabelle
VALUE_A=$( echo $ZEILE | cut -d " " -f $SNR | sed -e 's/,/./g' )
# ^- liest die erste Temp. aus und passt das Format fuer bc an
#echo $VALUE_A

for (( SNR=2; $SNR <= $SNR_MAX; SNR++ ))
do
VALUE_B=$( echo $ZEILE | cut -d " " -f $SNR | sed -e 's/,/./g' )
#echo VALA: $VALUE_A
#echo VALB: $VALUE_B
VALUE_C=$(echo "($VALUE_A - $VALUE_B)" | bc -l)
# ^- berechnet die Temperaturdifferenz
#echo VALC: $VALUE_C
VALUE_D=$(echo $VALUE_C | sed -e 's/-//g' -e 's/^\./0,/g' -e 's/\./,/g' )
# ^- Betragsbildung, Ausgabeformatanpassung
# echo Differenz $SNR-1: $VALUE_D
DIFFLINE="$DIFFLINE $VALUE_D" # Laesst Ergebnis-String wachsen
VALUE_A=$VALUE_B
done

#echo DIFFLINE:
#echo $DIFFLINE

((NCOLS1=$NCOLS-1)) # Bei horiz. Diff. hat die Ergebnis-Tabelle eine Spalte weniger
echo "ncols $NCOLS1" > diffline.txt # Erzeugt Header der neuen Tabelle
echo "nrows $NROWS" >> diffline.txt
<$1 head -n 6 | tail -n 4 >> diffline.txt

#sed -e 's/ 0 / 0,00000 /g' diffline.txt | sed -e 's/ 0 / 0,00000 /g' > diffline2.txt
# ^- Formatanpassung: ersetzt "0" durch "0,00000"
todos diffline2.txt # Erzeugt Windows-Zeilenumbrueche
#echo Diffline:
cat diffline2.txt



Leider braucht das Script alleine für die erste der 1500 Datenzeilen schon gut 6 Sekunden.

Nun die Fragen:
Warum dauert das so lange? Weil so viele Kindprozesse aufgerufen werden müssen (sed, bc)?
Ist die Bash für sowas eher ungeeignet? Hätte ich besser ein C-Programm schreiben sollen?


Gruß, Bartho

BID = 654795

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  


Zitat :
Ist die Bash für sowas eher ungeeignet? Hätte ich besser ein C-Programm schreiben sollen?
Genau das.
Interpreter sind ohnehin schon ziemlich langsam, aber hier rufts du in jeder Zeile auch noch den Streameditor sed auf, der dann jedesmal geladen wird.

BID = 654823

clembra

Inventar



Beiträge: 5404
Wohnort: Weeze / Niederrhein
ICQ Status  

C gilt im allgemeinen für die schnellste benutzbare Sprache, wenn man sie beherrscht. Assembler ist die schnellste unbenutzbare
Für die Auswertung von Logfiles ist übrigens mal eine eigene Sprache geschrieben worden, und sie hat auch schon hier geantwortet
Es ist zwar auch eine interpretierte Sprache, aber du kannst dir die ganzen Zusatzaufrufe sparen, was einen sehr großen Zeitvorteil ausmachen würde; zumal die Funktionen alle in perl selbst machbar sind.

_________________
Reboot oder be root, das ist hier die Frage.

BID = 654828

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Offtopic :

Zitat :
und sie hat auch schon hier geantworte
ER, mein lieber Freund, ER!
Jede Namensähnlichkeit mit Lebenden oder Scheintoten ist rein zufällig.

BID = 654831

clembra

Inventar



Beiträge: 5404
Wohnort: Weeze / Niederrhein
ICQ Status  


Offtopic :
Das sie war auf die Sprache bezogen. Es ist auch irgendwie doof, wenn man zwei "Dinge" vereinen möchte, die nichts miteinander zu tun haben


_________________
Reboot oder be root, das ist hier die Frage.

BID = 654833

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Sowas implementiert man am besten in Java, Javascript oder wenn es wirklich schnell sein muss in C++; C ist für sowas prinzipiell auch kein Problem, aber in C kann man sich, gerade was Zeichenketten anbelangt, schnell blöde Probleme einhandeln.

C++ hat sichere String-Objekte, Vektoren etc, die dafür besser geeignet sein dürften.

Perl geht auch, würde ich aber nicht machen.

_________________

BID = 654855

Bartholomew

Inventar



Beiträge: 4681

Besten Dank für die vielen Antworten
Bei 154 Werten pro Zeile braucht das Script auf dem Läppi 5,5s pro Zeile, auf dem Desktop 3,9s. Bei um 1500 Zeilen braucht das Programm also um zwei Stunden (±20 Minuten, je nach Rechner). Ein dutzend Datensätze sollen aufbereitet werden, ist also noch akzeptabel.
Wenn ich Zeit und Muße habe, stricke ich vielleicht noch eine Lösung in Java/Cxx.

So habe ich mal ein wenig Bash-Programmierung geübt, auch nicht verkehrt.


Gruß, Bartho

BID = 654857

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin Bartho,

Bei mir sind auch einige Programme nur entstanden, um damit Daten zu verarbeiten, die ich mit herkömmlich verfügbaren Programmen nicht berechnen konnte. Ist auch Gang und Gebe.

Dazu kann ich mich auch per ssh auf Unirechnern einloggen und die rechnen lassen. Das geht unter Umständen schneller (wenn man nicht gekillt wird, weil die Auslastung verdächtig vorkommt ).

Aber zwei Stunden sind doch in Ordnung. Macht man halt die Zeit was anderes.
Wenn sich nicht nach zwei Stunden herausstellt, dass man einen kleinen Fehler im Programm hatte, ist das einmalig akzeptabel.

_________________

BID = 654937

Bartholomew

Inventar



Beiträge: 4681

So, habe noch ein wenig im Code rumgepfuscht und alle sed-Aufrufe aus den Schleifen verbannt (reicht ja, die Eingabedatei und die Ausgabedatei einmal anzupassen). Auf dem Läppi brauche ich jetzt statt 5,5 Sekunden pro Zeile nur noch 3,6 Sekunden, das Script läuft also nur noch 2/3 so lange.
Was den Rest angeht:
In den 3,6 Sekunden werden cut und bc je 350, echo 700 mal aufgerufen. Das dauert wohl einfach etwas...
Ich sehe auch nicht, wie ich das (mit der Bash) noch reduzieren könnte. Bleibt dann wohl so.


Gruß, Bartho

BID = 654940

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
statt 5,5 Sekunden pro Zeile nur noch 3,6 Sekunden,
Ein immer noch miserabler Wert.
Als kompiliertes Programm braucht das sicher nur ein paar Mikrosekunden pro Zeile, wobei die meiste Zeit für das Lesen und Schreiben der Daten draufgehen wird.

Wie von DonComi schon angesprochen, spielt das aber bei einer so geringen Datenmenge und nur gelegentlicher Anwendung keine Rolle.
Viel wichtiger ist es dann, dass das Programm richtig *) ist und verstehbar und wartbar bleibt.


*) Compiler haben manchmal ihre eigenen Vorstellungen davon, wie etwas zu rechnen sei, und man kann ihnen dabei nur schwer auf die Finger schauen.


P.S:
Ich sehe gerade, dass in deinen Rohdaten das Komma als Dezimalzeichen verwendet wird. Ist das wirklich so?
Zumindest in solch englisch dominierten Daten wäre das ungewöhnlich.

[ Diese Nachricht wurde geändert von: perl am 13 Dez 2009  1:50 ]

BID = 654946

Bartholomew

Inventar



Beiträge: 4681


Zitat :
Ich sehe gerade, dass in deinen Rohdaten das Komma als Dezimalzeichen verwendet wird. Ist das wirklich so?


Zumindest in den Datenblöcken, die ich von meinem Mitbewohner bekommen habe. Das Programm (Name vergessen), mit dem er arbeitet, kann die Karten als ASCII-Textdateien exportieren (neben diversen anderen Formaten, die mir aber wohl wenig nützen); davon habe ich Gebrauch gemacht.

Allmählich dämmert mir auch, warum jenes Programm eine Schnittstelle für perl-Scripte hat

Bin mal gespannt, wie aussagekräftig die Karte wird; ich tippe darauf, dass man recht wenig erkennen wird. Aber wenn die Betreuerin das Ding haben will...

Der bc braucht übrigens von den 3,6 Sekunden pro Zeile eine Sekunde für sich (gerade ausprobiert). Nach dem Schlafen bastel ich mal zu Übungszwecken ein zweites Bash-Script, dass die vertikalen Temperaturdifferenzen berechnet; und dann noch ein drittes, dass die beiden Differenzkarten in einer Karte zusammenfasst. Dann lerne ich gleich was über Laufzeiten.

Die Rechenzeit an sich sollte kein Problem sein, ich muss noch nicht mal auf die Uni-CIP-Pools zurückgreifen. Hier sind noch diverse VDRs (1GHz PIII) im nahen und fernen Heimnetz, die sich die meiste Zeit über eh nur langweilen


Gruß, Bartho

BID = 654948

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

@Perl:

Der Punkt wird als Dezimalzeichen in allen mir bekannten Sprachen und Scripten verwendet. In vielen dieser Sprachen gibt es nämlich den sogenannten Komma-Operator, der mit Dezimalzahlen nichts zu tun hat (, und sogar ohne Syntaxfehler brav umgesetzt wird... Das kann im Programm später lustige Sachen verursachen)
Daher müssen Rohdaten wie diese auch angepasst werden.

(Gibt dann wiederum Rechenprogramme, die expizit ein Kommata als Dezimalzeichen haben wollen)

Wenn das Script aber jetzt funktioniert, dann würd ich es gut sein lassen.
C++ mitsamt ordentlicher Struktur dauert wesentlich länger in der Entwicklung. Von C gar nicht zu reden.

_________________

BID = 654949

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Offtopic :

Zitat :
Der Punkt wird als Dezimalzeichen in allen mir bekannten Sprachen und Scripten verwendet.
Dann kennst du COBOL nicht:
"DECIMAL-POINT IS COMMA" http://publib.boulder.ibm.com/infoc.....5.htm
Damit hast du aber auch nichts verpasst.

BID = 654950

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Offtopic :

Nabend perl!
Doch, doch, das wusste ich schon.
Aber wirklich angewendet habe ich COBOL noch nie.

Ich glaube, diese Anweisung hast du in einem anderen, aber ähnlichen Zusammenhang schonmal gebracht.



_________________

BID = 654953

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Offtopic :

Zitat :
wirklich angewendet habe ich COBOL noch nie.
Dann lass es dabei!
Einer der Compilerpäpste, ich glaube es war Dijkstra, schrieb dazu sinngemäß:
COBOL verwirrt den Geist und das Lehren dieser Sprache sollte als Straftat verfolgt werden.


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 182290603   Heute : 1428    Gestern : 4667    Online : 422        6.11.2024    11:18
1 Besucher in den letzten 60 Sekunden        alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0947589874268