zeilenweises auslesen aus einer datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ddd123
Beiträge: 20
Registriert: 13.10.2006 16:19:45

zeilenweises auslesen aus einer datei

Beitrag von ddd123 » 22.01.2007 11:53:41

Hallo,

ich habe folgendes Verstaendnis-Problem: Ich habe eine Textdatei und moechte diese zeilenweise in eine Variable schreiben, etwa so:

Code: Alles auswählen

#!/bin/bash
#set -xvn

for wert in `cat Datei`
do
   echo $wert
done
Dabei bekomme ich aber nicht immer die Zeile mit dem Skript angezeigt, wie sie z.B. der Orginal-Befehl "cat Datei" ausgibt. Ich hoffe ich habe mich verstaendlich ausgedrueckt. :D

dilorenzo
Beiträge: 35
Registriert: 22.09.2005 11:53:09

Beitrag von dilorenzo » 22.01.2007 11:59:08

Müsste es nicht so heissen?
(Habe leider gerade kein Linux zur Hand.)
for wert in $(`cat Datei` )
do
echo $wert
done

ddd123
Beiträge: 20
Registriert: 13.10.2006 16:19:45

Beitrag von ddd123 » 22.01.2007 12:17:58

damit bekomme ich folgende Fehlermeldung :x

./test.sh: line 1: xx:xx:xx:: command not found

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 22.01.2007 12:20:00

ddd123 hat geschrieben:damit bekomme ich folgende Fehlermeldung :x

./test.sh: line 1: xx:xx:xx:: command not found
Ja, dilorenzo hatte einen kleinen Fehler in seinem Code. Die Backticks von dir haben die identische Wirkung wie $(). Durch die Verdopplung wird nun versucht den Inhalt der Dateien auszuführen. Allerdings habe ich dein Problem auch nicht wirklich verstanden. Was meinst du mit
Dabei bekomme ich aber nicht immer die Zeile mit dem Skript angezeigt, wie sie z.B. der Orginal-Befehl "cat Datei" ausgibt.
?

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 22.01.2007 12:22:22

Weiß zwar nicht genau, was du vorhast, aber vielleicht stimmt der Pfad zur Datei nicht oder was für eine Fehlermeldung bekommst du?

Sonst verwende mal eine Datei zum Einlesen, die im gleichen Verzeichnis wie das Skript liegt und schreibe anstelle von Datei ein $1 und rufe das Skript so auf.

./skript.sh datei

Bei funktioniert das z.B. ohne Probleme.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.01.2007 12:24:24

Code: Alles auswählen

while read line; do 
  echo $line
done <Datei
Gruß
gms

ddd123
Beiträge: 20
Registriert: 13.10.2006 16:19:45

Beitrag von ddd123 » 22.01.2007 13:35:47

Also, was ich meine ist folgendes:

cat Datei

20070121:21:0001:54: 23: 2.54: 925.03
20070121:41:0001:55: 72: 9.1: 3.54
20070121:71:0001:56: 3: 6.966: 6.78
20070121:71:0001:57: 1: 1: 9.99

./test.sh

20070121:21:0001:54:
*Zeilenumbruch***********************************************
23:
*Zeilenumbruch***********************************************
2.54:
*Zeilenumbruch***********************************************
925.03
*Zeilenumbruch***********************************************
20070121:41:0001:55:
*Zeilenumbruch***********************************************
72:
*Zeilenumbruch***********************************************
9.1:
*Zeilenumbruch***********************************************
3.54
*Zeilenumbruch***********************************************

usw.

Ich haette gerne folgendes: :D

20070121:21:0001:54: 23: 2.54: 925.03
*Zeilenumbruch***********************************************
20070121:41:0001:55: 72: 9.1: 3.54
*Zeilenumbruch***********************************************
20070121:71:0001:56: 3: 6.966: 6.78
*Zeilenumbruch***********************************************
20070121:71:0001:57: 1: 1: 9.99
*Zeilenumbruch***********************************************

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 22.01.2007 13:45:53

Hm, wenn ich deine Zeilen in eine Datei packe, liefert folgender Code das Ergebnis:

Code: Alles auswählen

while read line; do 
  echo $line 
  echo "*Zeilenumbruch***********************************************"
done < test.txt
20070121:21:0001:54: 23: 2.54: 925.03
*Zeilenumbruch***********************************************
20070121:41:0001:55: 72: 9.1: 3.54
*Zeilenumbruch***********************************************
20070121:71:0001:56: 3: 6.966: 6.78
*Zeilenumbruch***********************************************
20070121:71:0001:57: 1: 1: 9.99
*Zeilenumbruch***********************************************

ddd123
Beiträge: 20
Registriert: 13.10.2006 16:19:45

Beitrag von ddd123 » 22.01.2007 14:36:26

Big Big sorry,

ich habe es jetzt mal so gemacht, wie vorgeschlagen (mit der while Schleife) und es funktioniert. Erstmal vielen Dank :D

Aber eine Frage habe ich noch. Warum geht es nicht mit der for Schleife? Was ist denn da anders?

goecke
Beiträge: 289
Registriert: 12.01.2007 11:57:27

Beitrag von goecke » 22.01.2007 14:56:08

Hi

... weil du zwei unterschiedliche Dinge tust - klingt komisch, ist abers so ;-)

Die For-Schleife ist im Prinzip eine lange Kommandozeile und dort wird am Leerzeichen (genauer: echo $IFS) getrennt (es ist auch shell expansion möglich, *.txt).
Der Bash-Brefehl read liest die Eingabe (stdin) bis zum Zeilenende (ausführlich => man bash)

gruss
Johannes

ddd123
Beiträge: 20
Registriert: 13.10.2006 16:19:45

Beitrag von ddd123 » 22.01.2007 15:18:59

alles klar :D Es stimmt ich habe Leerzeichen in der Datei. Idee, ich entferne am besten vorher alle Leerzeichen. Ich sehe naemlich gerade, das ich dadurch noch mehr Schwierigkeiten bekomme.

Frage: Wie macht man das am elegantesten? mit sed?

goecke
Beiträge: 289
Registriert: 12.01.2007 11:57:27

Beitrag von goecke » 22.01.2007 15:27:26

ddd123 hat geschrieben:alles klar :D Es stimmt ich habe Leerzeichen in der Datei. Idee, ich entferne am besten vorher alle Leerzeichen. Ich sehe naemlich gerade, das ich dadurch noch mehr Schwierigkeiten bekomme.

Frage: Wie macht man das am elegantesten? mit sed?
http://www.debianforum.de/forum/viewtop ... ht=cat+sed
2. Beitrag

oder tr

gruss
Johannes

Antworten