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  13:26:39      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 ( Vorherige Seite 1 | 2 )      


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

    







BID = 662271

xeraniad

Gelegenheitsposter



Beiträge: 53
 

  


Beispiel-Daten (test.dat):


Code :


ncols 354
nrows 2
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



Das Original-Script war vermutlich daher langsam, weil die Input-Datei für jede Zeile (als Eingabe für "sed") einmal gelesen wurde (so wie ich das flüchtig verstanden hatte). Daher wäre eine Beschleunigung zu erwarten, indem die Eingabe-Datei nur einmal gelesen werden soll.

Der Befehl "awk", sofern vorhanden, könnte hier recht effizient sein (test.sh):


Code :


#!/bin/sh
if [ 1 -eq ${#} ] ; then
if [ -f "${1}" ] ; then
awk 'BEGIN { # initialisations
nln = 0
} { # for each input line
if ("ncols" != $1) {
if ("nrows" != $1) {
if (("xllcorner" != $1) && ("yllcorner" != $1) && ("cellsize" != $1) && ("NODATA_value" != $1)) {
nln ++
if (NF != ncols) {
print "*** Unexpected number of columns; NF: " NF ", ncols: " ncols "."
print "$0: \"" $0 "\""
}

for (col = 1; NF >= col; col ++) { # get column values
str = $col
pos = index (str, ",")
if (0 != pos) { # replace comma by dot
str = substr (str, 1, pos-1) "." substr (str, 1+pos)
} # comma found
# print "str: \"" str "\""
val[col] = str
} # col

if (1 != nln) {
for (col = 1; NF >= col; col ++) {
d = val [col] - pre [col] # delta
pos = index (d, ".")
if (0 != pos) { # replace dot by comma
d = substr (d, 1, pos-1) "," substr (d, 1+pos)
} # dot found
if (1 != col) { str = str " " d }
else { str = d } # first value
}
print str
} # not first line

for (col = 1; NF >= col; col ++) { # copy column values
pre [col] = val [col]
} # col
} # not a keyword
} else {
nrows = $2
}
} else {
ncols = $2
}
} END { # final actions
if (nln != nrows) { print "*** Unexpected number of rows." }
}' < ${1}
else
echo "${0}: Input file \"${1}\" not found."
exit 1
fi
else
echo "${0}: Unexpected number of arguments ${#}; expected 1."
exit 1
fi
exit 0


Der Aufruf ./test.sh test.dat gibt die Differenz-Spalten aus.


Code :


1,14828 2,24909 0,55222 0 1,13385 2,84063 2,8172 2,82883 2,8057 0,5611 -2,24909 -3,41601 -1,7261 1,14337 1,12915 -1,13858 -1,14828 -0,57538 1,13385 0,5611 1,11994 0 0 0 0,55438 0 0,55438 0 -0,55438 -0,55438 -0,55222 -0,55222 -1,65664 -0,55004 0,55222 -1,11099 -1,69025 2,23996 0 -1,70432 -0,57047 0,56811 -0,5611 -0,56341 0,55884 -2,23093 -3,33319 -2,7612 -2,77209 -3,33319 -3,34656 -1,11994 2,23093 0 0,5458 -1,11099 -1,11994 3,33319 2,18753 -0,55438 1,11545 0 1,65664 1,65021 0 -1,12451 -0,56811 1,67655 -1,10226 -2,18753 -1,09375 -1,10226 0 0 -0,55661 0 0 0,54795 0 -0,54171 -1,10226 0 0 0 -0,55661 0 -2,20459 -2,7612 -2,75039 -1,69025 -2,27722 -1,1532 -0,57538 0 0,5611 1,13858 2,27722 1,12915 0,5611 -0,55884 0 1,11994 1,68335 1,12451 1,11545 1,68335 1,12915 -0,56341 -1,12451 0 0,56811 -0,56341 0,56341 1,11994 1,11994 0,5611 2,24909 2,78315 0,55438 -0,5611 0,56574 3,37381 3,37381 1,11545 0,54795 0,54795 1,09799 0,55004 0,55222 0 0 0,55438 0,55222 0 -0,55004 0 0,5458 -0,5458 -1,09375 -0,55222 -0,55438 -0,55438 0 0 -0,55222 0 -0,54795 0 0 0 -0,5458 -0,5458 -0,54795 0,55222 1,64379 1,08954 0,54374 0,54374 0,54374 0,54171 1,08545 1,08954 0,5458 1,63749 0,5458 -0,5458 0 0 0,55884 0,55661 0 -0,55004 0 0,55004 0 0 0,55222 0 -1,10226 -3,9123 -3,41601 -1,15817 0,58295 -0,58295 1,7261 2,28686 1,14828 0,5729 0,56811 0 1,69726 2,8526 3,44503 2,26773 1,11994 1,11545 1,66983 0 -1,11545 -0,55661 -1,66321 -1,66983 -1,1066 -0,55004 0,54795 -0,55004 0,55222 1,66983 1,68335 2,79434 3,9123 3,36008 2,8057 2,7612 -1,09799 -4,42694 -5,69412 -4,67444 -2,94089 -2,94089 -5,74261 -5,46979 -1,60708 -0,53372 0 0,53372 1,06942 1,06549 1,58963 1,58963 0,52988 0,53177 0 0 0,53177 -0,53177 -0,53372 -1,06942 -1,07336 -0,5357 -0,53372 0 0 0 0 0 -0,52988 -0,53177 -1,06165 -2,12335 -2,13107 -1,58963 -1,05786 -0,52798 -0,52798 0 0 -1,05786 -0,52798 -0,52988 -1,05786 -1,05786 -0,52798 -0,52798 0 -0,52798 -0,53177 -0,5357 0 0 1,06942 1,06942 0 -0,5357 -1,06942 -0,53177 -0,52798 0 1,05786 0,52613 0 0 0 0 -0,52066 -0,52066 -0,52066 -1,03952 -0,51886 -0,52066 0 0,52243 1,05042 1,05411 0,52798 0,53177 1,61905 1,09799 -0,54374 1,60119 1,60708 0,5357 0,53177 0,53372 -0,50189 0,04501 0,01023 0,5039 0,47882 -0,0503 0,00034 0,0333 0,07476 -0,02176 -0,13874 -0,72699 -1,14322 -0,49485 0,5458 1,09799 -0,55222 -1,10226 0 0,55004 1,09375 0,5458 0 -0,55438 -1,66983 -1,65664 0 0,55438 0 -1,09799 -1,65021 1,09375 1,09375 1,09799 0,5458 -0,54374 0 0,54171 0,54171 -1,08545 -1,08954 -1,08954 -0,54171 -1,08954 0 0 -0,5458 1,08139 -0,54795 -0,53968



[ Diese Nachricht wurde geändert von: xeraniad am 12 Jan 2010 17:36 ]

BID = 662304

Bartholomew

Inventar



Beiträge: 4681

 

  

Hoi,

Au weia, hoffentlich hast Du da nicht lange dran gesessen. Hatte ganz vergessen, dass ich das Thema noch nicht abgeschossen hatte.
Hatte mein Script noch mal etwas abgeändert (die Punkt-Komma-Ersetzung einmal für die Gesamte Eingabe- und Ausgangsdatei durchgeführt, statt Wertweise), hat das Programm etwa ein Drittel schneller gemacht. Anbei mal meine Scripte für horizontale Differenz, vertikale Differenz und Gesamtdifferenz:



Code :

#!/bin/bash

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

if [ -z "$1" ] # Pruefe, ob Eingabe-Datei uebergeben
then
echo "Input-Datei angeben!"
exit 1
fi

<$1 grep ncols # Pruefe schlampig, ob Eingabe-Datei gueltig
if [ $? != 0 ]
then
echo Ungueltige Eingabe-Datei!
exit 2
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' )

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

<$1 sed -e 's/,/./g' > $1_hdiff.tmp # Bereite fuer bc vor
rm $1_hdiff_2.tmp 2>/dev/null # Raeume auf

STARTZEILE=7 # Erste Zeile des Datenblockes
((ENDZEILE=$STARTZEILE + $NROWS - 1)) # letzte Zeile des Datenblockes
ENDZEILE=16
ZNR=$STARTZEILE # Aktuelle Zeile Nr.
#SNR=1 # Akutelle Spalte Nr.
SNR_MAX=$NCOLS # Abbbruch-Bedingung

for (( ZNR=$STARTZEILE; ZNR <= $ENDZEILE; ZNR++ ))
do
echo Verarbeite Zeile $ZNR von $ENDZEILE
DIFFLINE="" # Initialisiere String mit den Differenztemperaturen

SNR=1
# Lese Zeile aus Tabelle aus und passe Format an:
ZEILE=$( <$1_hdiff.tmp head -n $ZNR | tail -n 1 )
VALUE_A=$( echo $ZEILE | cut -d " " -f $SNR )
# ^- liest die erste Temp. aus
#echo $VALUE_A

for (( SNR=2; $SNR <= $SNR_MAX; SNR++ ))
do
VALUE_B=$( echo $ZEILE | cut -d " " -f $SNR )
#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_C" # Laesst Ergebnis-String wachsen
#DIFFLINE="$DIFFLINE $VALUE_B" # Laesst Ergebnis-String wachsen
VALUE_A=$VALUE_B
done

echo $DIFFLINE >> $1_hdiff_2.tmp # Haengt eine Ergebniszeile an die Tabelle an

done

# Passe Format an:
echo Passe Format an...
<$1_hdiff_2.tmp sed -e 's/-//g' -e 's/\./,/g' -e 's/^,/^0,/g' -e 's/ ,/ 0,/g' >> $1_hdiff.txt

#rm $1_hdiff.tmp $1_hdiff_2.tmp # Raeume auf

#sed -e 's/ 0 / 0,00000 /g' diffline.txt | sed -e 's/ 0 / 0,00000 /g' > diffline2.txt
# ^- Formatanpassung: ersetzt "0" durch "0,00000"
echo Erzeuge Windows-Zeilenumbrueche...
todos $1_hdiff.txt # Erzeugt Windows-Zeilenumbrueche
#Kommando, das "frodos" ersetzt:
#sed 's/\x0D//' oldfile > newfile

#echo
#echo $1_hdiff.txt:
#cat $1_hdiff.txt
echo Fertig.






Code :

#!/bin/bash

# vdiff.sh
# Erstellt eine Tabelle mit vertikalen Temperatur-Differenzen.

if [ -z "$1" ] # Pruefe, ob Eingabe-Datei uebergeben
then
echo "Input-Datei angeben!"
exit 1
fi

<$1 grep ncols 1>/dev/null # Pruefe schlampig, ob Eingabe-Datei gueltig
if [ $? != 0 ]
then
echo Ungueltige Eingabe-Datei!
exit 2
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' )

# Neue Datei anlegen:
((NROWS1=$NROWS-1)) # Bei vert. Diff. hat die Ergebnis-Tabelle eine Zeile weniger
echo "ncols $NCOLS" > $1_vdiff.txt # Erzeugt Header der neuen Tabelle
echo "nrows $NROWS1" >> $1_vdiff.txt
<$1 head -n 6 | tail -n 4 >> $1_vdiff.txt

<$1 sed -e 's/,/./g' > $1_vdiff.tmp # Bereite fuer bc vor
rm $1_vdiff_2.tmp 2>/dev/null # Raeume auf

STARTZEILE=7 # Erste Zeile des Datenblockes
((ENDZEILE=$STARTZEILE + $NROWS - 1)) # letzte Zeile des Datenblockes
#ENDZEILE=17
ZNR=$STARTZEILE # Aktuelle Zeile Nr.
#SNR=1 # Akutelle Spalte Nr.
SNR_MAX=$NCOLS # Abbbruch-Bedingung

ZEILE_A=$( <$1_vdiff.tmp head -n $ZNR | tail -n 1 )
#((ZNR=$ZNR + 1))
#echo ZNR: $ZNR
#echo Zeile A:
#echo $ZEILE_A

for (( ((ZNR=$ZNR + 1)); ZNR <= $ENDZEILE; ZNR++ ))
do
echo Verarbeite Zeile $ZNR von $ENDZEILE
DIFFLINE="" # Initialisiere String mit den Differenztemperaturen

#SNR=1
# Lese Zeile aus Tabelle aus und passe Format an:
ZEILE_B=$( <$1_vdiff.tmp head -n $ZNR | tail -n 1 )
#VALUE_A=$( echo $ZEILE | cut -d " " -f $SNR )
# ^- liest die erste Temp. aus
#echo $VALUE_A

for (( SNR=1; $SNR <= $SNR_MAX; SNR++ ))
do
VALUE_A=$( echo $ZEILE_A | cut -d " " -f $SNR )
VALUE_B=$( echo $ZEILE_B | cut -d " " -f $SNR )
#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_C" # Laesst Ergebnis-String wachsen
#DIFFLINE="$DIFFLINE $VALUE_B" # Laesst Ergebnis-String wachsen
#VALUE_A=$VALUE_B
done

echo $DIFFLINE >> $1_vdiff_2.tmp # Haengt eine Ergebniszeile an die Tabelle an
ZEILE_A=$ZEILE_B

done

# Passe Format an:
echo Passe Format an...
<$1_vdiff_2.tmp sed -e 's/-//g' -e 's/\./,/g' -e 's/^,/^0,/g' -e 's/ ,/ 0,/g' >> $1_vdiff.txt

#rm $1_vdiff.tmp $1_vdiff_2.tmp # Raeume auf

#sed -e 's/ 0 / 0,00000 /g' diffline.txt | sed -e 's/ 0 / 0,00000 /g' > diffline2.txt
# ^- Formatanpassung: ersetzt "0" durch "0,00000"
echo Erzeuge Windows-Zeilenumbrueche...
todos $1_vdiff.txt # Erzeugt Windows-Zeilenumbrueche
#Kommando, das "frodos" ersetzt:
#sed 's/\x0D//' oldfile > newfile

#echo
#echo $1_vdiff.txt:
#cat $1_vdiff.txt
echo Fertig.






Code :

#!/bin/bash

# gdiff.sh
# Fuegt Tabellen mit horiz. und vert. Temperatur-Differenzen zusammen.

if [ -z "$1" ] # Pruefe, ob Eingabe-Datei uebergeben
then
echo "Dateiname angeben!"
exit 1
fi

<$1_hdiff.txt grep ncols 1>/dev/null # Pruefe schlampig, ob Eingabe-Datei gueltig
if [ $? != 0 ]
then
echo $1_hdiff.txt ungueltig!
exit 2
fi

<$1_vdiff.txt grep ncols 1>/dev/null # Pruefe schlampig, ob Eingabe-Datei gueltig
if [ $? != 0 ]
then
echo $1_vdiff.txt ungueltig!
exit 2
fi


# Zeilen, Spalten und Cellsize aus Quelltabelle auslesen:
NCOLS=$( <$1_vdiff.txt grep ncols | sed -e 's/[^0-9]//g' )
NROWS=$( <$1_hdiff.txt grep nrows | sed -e 's/[^0-9]//g' )
CSIZE=$( <$1_hdiff.txt grep cellsize | sed -e 's/[^.0-9]//g' )
CSIZE=$( echo "($CSIZE/4)" | bc -l | sed 's/^./0./g' )

# Neue Datei anlegen:
((NROWS1=($NROWS-1)*2)) # Bei vert. Diff. hat die Ergebnis-Tabelle eine Zeile weniger
((NCOLS1=($NCOLS-1)*2)) # Bei horiz. Diff. hat die Ergebnis-Tabelle eine Spalte weniger
echo "ncols $NCOLS" > $1_gdiff.txt # Erzeugt Header der neuen Tabelle
echo "nrows $NROWS" >> $1_gdiff.txt
<$1_hdiff.txt head -n 4 | tail -n 2 >> $1_gdiff.txt
echo "cellsize $CSIZE" >> $1_gdiff.txt
<$1_hdiff.txt head -n 6 | tail -n 1 >> $1_gdiff.txt

# Kommando, das "frodos" ersetzt:
# sed 's/\x0D//' oldfile > newfile
<$1_hdiff.txt sed 's/\x0D//g' > $1_hdiff.tmp # Loesche Wagenruecklauf
<$1_vdiff.txt sed 's/\x0D//g' > $1_vdiff.tmp # Loesche Wagenruecklauf

rm $1_vdiff_2.tmp 2>/dev/null # Raeume auf

STARTZEILE=7 # Erste Zeile des Datenblockes
((ENDZEILE=$STARTZEILE + $NROWS - 2)) # letzte Zeile des Datenblockes
#ENDZEILE=17
ZNR=$STARTZEILE # Aktuelle Zeile Nr.
#SNR=1 # Akutelle Spalte Nr.
((SNR_MAX=$NCOLS)) # Abbbruch-Bedingung

## Muster:
## lo|lo|lo
## ur|ur|ur
## --+--+--
## lo|lo|lo
## ur|ur|ur
## --+--+--
## lo|lo|lo
## ur|ur|ur

# Oberste Zeile:
echo "Verarbeite erste Halbzeile..."
MERGELINE_1=""
ZEILE_H=$( <$1_hdiff.tmp head -n $ZNR | tail -n 1 )
ZEILE_H1="0 $ZEILE_H" # Links kein Nachbar
for (( SNR=1; SNR <= SNR_MAX; SNR++ ))
do
MERGELINE_1=$MERGELINE_1$( echo $ZEILE_H1 | cut -d " " -f $SNR )" 0 "
done
#echo $MERGELINE_1
echo "$MERGELINE_1" >> $1_gdiff.txt

# Normale Doppelzeile:
for (( ZNR=$ZNR; ZNR <= $ENDZEILE; ZNR++ ))
do
echo Verarbeite Zeile $ZNR von $ENDZEILE
ZEILE_V=$( <$1_vdiff.tmp head -n $ZNR | tail -n 1 )
ZEILE_H2=$ZEILE_H" 0" # Rechts kein Nachbar
((ZNR2=$ZNR+1))
ZEILE_H=$( <$1_hdiff.tmp head -n $ZNR2 | tail -n 1 )
ZEILE_H1="0 $ZEILE_H" # Links kein Nachbar
MERGELINE_2=""
MERGELINE_1=""
for (( SNR=1; SNR <= SNR_MAX; SNR++ ))
do
VDIFF=$( echo $ZEILE_V | cut -d " " -f $SNR )
MERGELINE_2=$MERGELINE_2"$VDIFF $( echo $ZEILE_H2 | cut -d " " -f $SNR ) "
MERGELINE_1=$MERGELINE_1"$( echo $ZEILE_H1 | cut -d " " -f $SNR ) $VDIFF "
#echo $MERGELINE_2
#echo $MERGELINE_1
done
#echo $MERGELINE_2
#echo $MERGELINE_1
echo "$MERGELINE_2" >> $1_gdiff.txt
echo "$MERGELINE_1" >> $1_gdiff.txt
done

# Letzte Zeile:
echo "Verarbeite letzte Halbzeile..."
ZEILE_H2=$ZEILE_H" 0" # Rechts kein Nachbar
MERGELINE_2=""
for (( SNR=1; SNR <= SNR_MAX; SNR++ ))
do
MERGELINE_2=$MERGELINE_2"0 $( echo $ZEILE_H2 | cut -d " " -f $SNR ) "
#echo $MERGELINE_2
done
#echo $MERGELINE_2
echo "$MERGELINE_2" >> $1_gdiff.txt


echo Erzeuge Windows-Zeilenumbrueche...
todos $1_gdiff.txt # Erzeugt Windows-Zeilenumbrueche
echo Fertig.



Nur die Ausgabe von hdiff.sh lässt sich von Arcgis (hat übrigens keine Perl- sondern eine Python-Schnittstelle) importieren, beim Import vdiff.sh und gdiff.sh wird gemeckert.
Ich habe das nicht weiter verfolgt, denn die horizontale Differenztemperaturkarte war, wie verumtet, nahezu nichtssagend und gegenüber der Temperaturkarte noch schlechter zu deuten.

Auf jeden Fall einen ganz großen Dank an Dich, Xeraniad Vielleicht hilft Dein Code hier noch jemandem. Ich werde ihn mir beizeiten noch mal zu Gemüte führen.


Gruß, Bartho

BID = 662465

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo!

Was mir noch, aus aktuellem Anlass, eingefallen ist: viele Programme, die Daten aufbereiten, auswerten oder darstellen sind in der Lage, direkt aus ASCII-Dateien zu lesen.

In meinem konkreten Fall waren es ein paar hundert Datenpaare samt Fehlerangaben für Gnuplot.

Gnuplot beherrscht zudem die numerische Weiterverarbeitung dieser Eingabedaten, daraus folgt, dass man z.B. Differenzen direkt berechnen lassen kann.

Für die Berechnung und die Anzeige schreibe ich ein Gnuplot-Script und mit einem Befehl werden die Daten geholt, verarbeitet, die Koordinatensysteme so gesetzt, wie ich sie haben will, die Ausgabe nach encapsulated postscript umgeleitet und in ein LaTeX-Dokument eingebunden...

Eventuell, je nach Datensätzen, noch die Eingabedaten so ändern, dass es reibungslos verläuft. Z.B. wie hier auch geschehen, über ein Shellscript Kommata in Punkte umzuwandeln und entsprechend deutliche Spalten formatieren.

Edit: Ja, hat nichts direkt mit dem aktuellen Problem hier zu tun, aber Gnuplot kann echt mehr als nur reine Darstellung.

_________________


[ Diese Nachricht wurde geändert von: DonComi am 13 Jan 2010  0:44 ]


Vorherige Seite      
Gehe zu Seite ( Vorherige Seite 1 | 2 )
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 23 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 182291134   Heute : 1960    Gestern : 4667    Online : 699        6.11.2024    13:26
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0398690700531