• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

for-Schleife Problem

Hallo Leute,
ich möchte gerne aus einem file (Textdatei) Name in eine Variable lesen. Dort stehen die Namen mit einem Lehrzeichen Bsp..

Code:
Tux Meister
linux club

meine for-Schleife sieht wie folgt aus

Code:
for x in `cat/scripte/namen.txt`; do
 zahl=$[ zahl + 1 ]
 echo $x.$zahl >>/namen.neu
done

Das macht er auch schön braff :) Nur Leider nicht die komlette Zeile. Ergebnis

Tux.1
Meister.2
linux3
club4

Er sollte aber schreiben

Tux Meister.1
linux club.4

habe es auchg schon versucht das cat durch pr zu ersetzten bringt auch nichts.
Kann mir eine Helfen?
 
vermutlich mußt du der shell (bash?) sagen, dass er das leerzeichen nicht als feldtrenner benutzt sondern nur den Zeilenumbruch.

Hab die Details grad nicht parat -> man bash
 
torbla schrieb:
Er sollte aber schreiben

Tux Meister.1
linux club.4
Sollte er nicht eher schreiben:

Tux Meister.2
linux club.4

???

In diesem Fall würde ich es so machen:

Code:
#!/bin/bash
#
zahl=0
cat namen.txt |
while read line
do
  zahl=$(expr $zahl + $(echo $line | wc -w))
  echo $line.$zahl >> namen.neu
done
Die Dateinamen bitte noch anpassen ...
 
pft schrieb:
vermutlich mußt du der shell (bash?) sagen, dass er das leerzeichen nicht als feldtrenner benutzt sondern nur den Zeilenumbruch.

Hab die Details grad nicht parat -> man bash
Meinst du $IFS ? Daran würde ich nicht rumspielen. Sonst erkennen wahrscheinlich die Befehle in der for-schleife ihre Parameter nicht mehr. Mit "cat datei | while read line" kann man die ganze Sache einfacher haben...
 
Meinst du $IFS ? Daran würde ich nicht rumspielen. Sonst erkennen wahrscheinlich die Befehle in der for-schleife ihre Parameter nicht mehr. Mit "cat datei | while read line" kann man die ganze Sache einfacher haben...

ja das meine ich. Aber deine Bedenken teile ich nicht (siehe man bash Ausschnitt unten). Aber grau ist alle Theorie. Soll er es doch mal probieren!

aus man bash:
IFS The Internal Field Separator that is used for word
splitting after expansion and to split lines into
words with the read builtin command. The default
value is ``<space><tab><newline>''.

also setze an den Anfang einfach ein
Code:
IFS="\n"
und es sollte gehen ... :)
 
pft schrieb:
also setze an den Anfang einfach ein
Code:
IFS="\n"
und es sollte gehen ... :)
Leider nicht:
Code:
test.ksh
Tux Meister
li.1
ux club.2
Wenn überhaupt, dann sollte man das so machen:
Code:
#!/bin/bash
#
IFS='
'
for x in `cat namen.txt`; do
 zahl=$[ zahl + 1 ]
 echo $x.$zahl
done
Die Ausgabe ist dann folgende:

Tux Meister.1
linux club.2

Ist das gewünscht? Dann müsste man wieder einen wc -w oder ähnliches machen. Da würde ich doch in aller Bescheidenheit meine eigene Lösung favourisieren. :wink:
 
Hallo Leute, vielen dank pft notoxp Ihr habt mir geholfen. Könntet Ihr mir kurz erläutern was der Befehl

Code:
IFS=''

bedeutet. Den Habe ich noch nie gesehen ???????
 
torbla schrieb:
Code:
IFS=''
bedeutet. Den Habe ich noch nie gesehen ???????
"man bash" sagt, dass IFS der "Internal Field Separator" ist. pft schlug vor, diesen auf ENTER zu setzen. Das passiert mit
Code:
IFS='
'
Bitte beachte, dass nach dem ist-gleich-Zeichen nur ein einfaches Hochkomma steht. Danach folgt ein ENTER, dann kommt nochmals ein einfaches Hochkomma.

Aber nochmals: Ich bin der Meinung, du brauchst den IFS gar nicht, da du mit der cat-while-Kombination auch zeilenweise einlesen kannst.

Zum Schluß noch eine Frage: Willst du die Summe aller Wörter am Zeilenende ausgeben, oder nur die die aktuelle Zeilennummer? Im letzten Fall brauchst du noch einen wc -w.
 
Oben