Sie sind nicht angemeldet.

1

15.07.2010, 06:50

[gelöst] Bash Script Ausgabe in Datei funktioniert nicht

Hallo Zusammen,
ich habe eine Menge Dateien aus denen ich jeweils eine Zahl auslesen will und dann in eine Matrix schreiben. Ich dachte das geht flott mit einem Bash-Script. Die Ausgabe auf dem Bildschirm funktioniert auch, aber sobalt ich die Ausgabe in eine Datei umleite stimmt die Formatierung nicht mehr. Kann mir jemand sagen warum?? Und vorallem helfen es richtig zu machen ;-)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#/bin/bash  
ls *.csv > liste.txt 
FILES=`wc -l < liste.txt` 
FILE=`head -1 liste.txt|tail -1` 
ALLLINES=`wc -l < $FILE` 
HEADER=22  
LINES=`expr $ALLLINES - $HEADER`  
volt=`head -$HEADER $FILE |tail -1|cut -f1 -d","`  
k=0 
h=$HEADER  
while test $k -le $LINES 
do i=1 l=1
 	while test $i -le $FILES
  	do
 	FILE=`head -$i liste.txt|tail -1`
 #	./lines.sh $1 $l $h $FILE
   		if test $l -lt $1
 		then
 			curr=`head -$h $FILE |tail -1|cut -f2 -d","`
 			printf "%s$curr\t"
 #			printf "%s$curr\t" >> $volt.dat
 #			echo -ne "$curr\t" >> $volt.dat
  			l=`expr $l + 1`
                            else		 			
                                          curr=`head -$h $FILE |tail -1|cut -f2 -d","`
 			printf "%s$curr\n"			 
                                          l=1
	 	fi  	 	
                 i=`expr $i + 1` 	
                done 
k=`expr $k + 1` 
h=`expr $HEADER + $k` 
volt=`head -$h $FILE |tail -1|cut -f1 -d","` 
done

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

15.07.2010, 10:50

RE: Bash Script Ausgabe in Datei funktioniert nicht

was stimmt denn an der "formatierung" nicht mehr? was erwartest du und was kommt wirklich heraus? das script ist leider nicht einfach zu durchschauen, da der inhalt der csv-dateien unbekannt ist und deshalb unklar bleibt, was die vielen $volt.dat dateien sollen. wie auch immer, ich würde auf jeden fall die liste.txt nicht im selben verzeichnis erzeugen lassen, sondern in /tmp und ich würde testen lassen, ob ein parameter angegeben wurde ( der ja wohl numerisch sein muss!!), da das script sonst sowieso amok läuft.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »linuxerr« (15.07.2010, 11:17)


3

15.07.2010, 11:20

RE: Bash Script Ausgabe in Datei funktioniert nicht

Die csv dateien haben eine header und dann zwei Spalten mit Zahlen. 1. Spalte Spannung 2. spalte Strom. Jede Datei behinaltet die Messung an einem Punkt in einer Ebene. Und ich will jetzt quasi für eine fixe Spannung ein Bild des Stroms in dieser Ebene erzeugen.
Also ich erwarte am Ende eine Matrix (NxN).
z.B.
-0.1 2.3
3.3 4.034

und raus kommt im Moment
-0.1
(hier ist ein Tab) 2.3
3.3
(hier auch ein Tab) 4.034
Und wie erwähnt das kommt nur raus wenn ich versuche die printf oder echo Befehle in eine Datei umzuleiten. Ich habe auch versucht, den inneren Teil als Extra script zu erstellen aber das hat nicht geklappt. Das mit dem /tmp ist ne gut Idee. Den Input check habe ich schon feritg. Ich wollte nur eine schnelle Lösung und Details später machen aber ich hänge halt fest an der Formatierung.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »karlkappe« (15.07.2010, 11:28)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

15.07.2010, 11:26

RE: Bash Script Ausgabe in Datei funktioniert nicht

welcher teil deines scripts soll denn die matrix erzeugen. es ist sehr unübersichtlich und die funktion kann man ohne die csv-dateien auch nicht reproduzieren.
verstehe ich das richtig, wenn du einen durchlauf im terminal machst, dann siehst du eine matrix, wenn du es in eine datei abspeicherst, dann siehst du nur eine liste. kannst du (zumindest den wichtigen teil) einer solchen datei hier mal hochladen?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

15.07.2010, 11:35

RE: Bash Script Ausgabe in Datei funktioniert nicht

csv- file
Ort 1.1
V I
-1.5, -1
-1, -0.5
0 , 0
1 , 0.5
-1.5 , 1

Ort 1.2
-1.5 ,-1.1
-1 , -0.6
0 , 0
1 , 0.6
-1.5, 1.1

Ort 2.1
-1.5 ,-1.2
-1 ,-0.4
0 , 0
1 , 0.4
-1.5 , 1.2

Ort 2.2
-1.5 ,-1.1
-1 , -0.6
0 , 0
1 ,0.6
-1.5 ,1.1

und am Ende will ich 5 Dateien. Die erste sollte so aussehen

-1 -1.1
-1.2 -1.1

usw.

Sorry hochladen geht nicht muss an meinem Browser liegen.
Achso und das ganze printf Zeug sollte die matrix machen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »karlkappe« (15.07.2010, 11:39)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

15.07.2010, 11:44

RE: Bash Script Ausgabe in Datei funktioniert nicht

ok, schau ich mir mal kurz an und melde mich dann wieder.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

7

15.07.2010, 12:25

RE: Bash Script Ausgabe in Datei funktioniert nicht

das problem der formatierung liegt in den windows-zeilenumbrüchen in den csv-dateien, die du in deiner printf ausgabe mit ausgibst und die alles versaut.
entferne diese und alles wird gut.

übrigens den programmierstil finde ich nicht so toll.
ich habe mir das script eine weile angeschaut und immer noch nicht verstanden, was es eigentlich tun soll. irgendwie werden die messdaten aller csv-dateien irgendwie neu angeordnet und kombiniert.
nunja...


achso, eine einfache möglichkeit die windows zeilenumbrüche zu entfernen ist zb
cat <datei> | tr -d "\r" > <neudatei>
tr entfernt alle \r returns und lässt die zeilenumbrüche \n in der datei.

ansonsten gibt es auch noch dos2unix etc ...
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »linuxerr« (15.07.2010, 12:35)


8

15.07.2010, 14:08

Das mit dem Programmierstil stimmt wohl, aber ich bin halt auch kein Programmierer :-). Sondern einfacher Messknecht, der ein wenig zu faul ist alles von Hand zu machen. Und eigentlich war ich ganz stolz es soweit gebracht zu haben ;-). Über Verbesserungs Vorschläge würde ich mich freuen. Und ja Du hast recht die Daten werden einfach nur umsortiert und in neue Dateien geschrieben. Ich mache das so umständlich, weil ich die einzelnen Zwischenergebisse vllt. noch für was anderes benutzen will. Das mit den Zeilenumbrüchen werde ich erst morgen versuchen können ich schreibe aber wenn es geklappt hat. Vielen Dank auf jedenfall mal!!!!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »karlkappe« (15.07.2010, 14:09)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

9

15.07.2010, 14:30

ok, ein paar tipps könnte ich dir geben.
kannst du vielleicht ganz kurz das sortierprinzip erklären?
werden jeweils die messdaten aus einer datei umsortiert
also zb
<1.messwert der ersten datei> <5.messwert der ersten datei>
<3.messwert der ersten datei> <4. messwert der ersten datei>
.....
<1.messwert der zweiten datei> <5.messwert der zweiten datei>
<3.messwert der zweiten datei> <4. messwert der zweiten datei>
.....

oder werden die messdaten aus allen dateien jeweils neu gruppiert, als zb
<1.messwert der ersten datei> <5.messwert der siebten datei>
<3.messwert der dritten datei> <4. messwert der achten datei>
.......
etc

kannst du eventuell noch eine zweite csv hochladen?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

10

15.07.2010, 15:43

hast du die csv hier wieder gelöscht?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

11

15.07.2010, 15:44

Du hattest recht jetzt tut es!
Das Sortierprizip ist:
1 Messwert aus datei 1 \t 1 messwert aus datei 2 .... bis 1 messwert aus datei n^2
wo bei nach jedem n-ten Messwert ein Zeilenumbruch kommen soll.

Die nächste Datei besteht dann aus den zweiten Messwerten aus allen Dateien.

Die Liste die ich oben geschrieben habe representiert 4 Dateien mit jeweils 5 Messwerten.
-> 5 Dateien mit einer 4x4 Matrix drin.

Ist das gut erklärt? Was ich machen muss sind 128x128 Dateien mit 220 Messwerten
-> 220 Dateien mit 128x128 Matrizen drin.
Dann muss ich noch was finden um die ordentlich zu plotten und dann will ich ein Video draus machen.
Im Moment ist das hauptproblem das es langsam ist was ich mache, vllt ist sowas wie Mathlab besser geeignet aber da kenn ich mich gar nicht aus.

12

15.07.2010, 16:16

RE: Bash Script Ausgabe in Datei funktioniert nicht

Ja.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »karlkappe« (15.07.2010, 16:17)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

13

15.07.2010, 16:30

RE: Bash Script Ausgabe in Datei funktioniert nicht

kannst du mir mal zwei von den csv per pn schicken?
es wäre sicherlich sinnvoller, zuerst alle werte der ersten datei in ein neues file einzutragen , danach die werte der zweiten datei jeweils an die zeilen anzuhängen etc...
wenn die dateien insgesamt nicht zu groß sind, könnte man auch alle messwerte in ein einziges array einlesen und dann neu ausgeben, geht bestimmt am schnellsten.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

14

15.07.2010, 17:12

RE: Bash Script Ausgabe in Datei funktioniert nicht

so, ich habe mal einen alternativvorschlag geschrieben. die headerzahl musst du noch anpassen (21 glaube ich). da ich die cvs datei nicht mehr habe,konnte ich es leider nicht testen

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# array, in dem die ausgabezeilen abgelegt werden
ZEILEN=()
# anzahl der zeilen im header
HEADER=4
# jede csv-datei wird nacheinander bearbeitet
while read DATEINAME
do
 # berechnung der zeilenzahl nach dem header
 LINENUMBERS=$( wc -l < ${DATEINAME} )
 DATALINES=$(( $LINENUMBERS - $HEADER ))
 ZEILENNUMMER=0
 # die datenzeilen der datei werden einzeln eingelesen
 while read LINE
 do
  # der gelesene wert wird jeweils an das entsprechenden
  # array ZEILE amit einem tabulator angehaengt
  LINESTART=${ZEILEN[${ZEILENNUMMER}]}
  ZEILEN[${ZEILENNUMMER}]="${ZEILEN[${ZEILENNUMMER}]}\t${LINE}"
  # die zeilennummer wird incrementiert
  ZEILENNUMMER=$(( $ZEILENNUMMER + 1 ))
 done < <( tail -${DATALINES} ${DATEINAME} )
done < <( ls *.csv )
#ausgabe mit einem zeilenumbruch am ende
for((NR=0;NR<${ZEILENNUMMER};NR++));
do
 echo "${ZEILEN[${NR}]}"
done

ich bin davon ausgegangen, dass in jeder zeile der dateien immer nur ein messwert eingetragen war, ich kann mich da nicht mehr dran erinnern und die dateihabe ich bereits gelöscht.
»linuxerr« hat folgende Datei angehängt:
  • testlister.sh (863 Byte - 7 mal heruntergeladen - zuletzt: 08.06.2018, 14:15)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »linuxerr« (15.07.2010, 17:17)


Thema bewerten