ubuntuusers.de

Textdatei zeilenweise in durchnummerierte Variablen schreiben

Status: Gelöst | Ubuntu-Version: Ubuntu 15.10 (Wily Werewolf)
Antworten |

viper2035

Anmeldungsdatum:
7. Juli 2007

Beiträge: Zähle...

Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable schreiben. So nach dem Schema: "Inhalt erste Zeile"=ZEILE1 "Inhalt zweite Zeile"=ZEILE2 Ich bin absoluter Bashneuling und bin nach etwas googlen auf den Code gekommen:

1
2
3
4
5
6
i=1
while read line; do
    zeile${i}=${line}
    (( i=$i+1 ))
done < /var/www/formular.txt
echo $zeile1

Leider funktioniert das nicht. Wo liegt der Fehler?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Ich bin nicht so firm in der bash und bekomme sicher gleich Korrekturen um die Ohren 😉

Aber du kannst im Prinzip mit "declare" arbeiten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#Beispiel
i=1
while read line
  do
    echo $i":"${line}
    declare "zeile$i=${line}"
    ((i+=1))
done < test.txt

echo "Zeile 1 ergibt:"
echo $zeile1

viper2035

(Themenstarter)

Anmeldungsdatum:
7. Juli 2007

Beiträge: 19

Sau gut, es geht. Ich habe eine Stunde nach so einem Befehl gesucht. Danke

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

Was genau ist denn der Zweck der Übung? Wenn du eine Datei mit festgelegter Zeilenabfolge hast, kannst du ja auch mit anderen Methoden an die Daten kommen.

Es ist z.B. für die weitere Verarbeitung recht praktisch die Zeilen in ein Array einzulesen:

1
2
3
4
#!/bin/bash
readarray formular < /var/www/formular.txt
echo ${formular[0]} # 1. Zeile
echo ${formular[1]} # 2. Zeile

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Die gleiche Frage hatten wir im Prinzip vor 2 Wochen hier schonmal. Damals war die beste Antwort:

1
2
3
4
5
6
7
8
var1=A
var2=B
var3=C

for i in 1 2 3 ; do
var="var$i"
echo ${!var}
done

Allerdings ist auch hier ein Array die klarere Lösung: seahawk1986 hat es ja schon vorgeschlagen.
Man kann es alternativ auch so schreiben:

track@track:~$ read -a zeile -d "\n" < <(echo -e "1a\n2b\n3c")
track@track:~$ echo $zeile
1a
track@track:~$ echo ${zeile[1]}
2b
track@track:~$ echo ${zeile[2]}
3c 

Die Doku dazu findest Du im Bash Manual oder unter help read.

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13208

seahawk1986 schrieb:

Was genau ist denn der Zweck der Übung?

Komisch, solche Anfragen scheinen sich zu häufen. Wir hatten so etwas ähnliches letztens schon mal.

Antworten |