Bash - Datei auslesen

Antworten
Nachricht
Autor
Benutzeravatar
AlPhedo
Beiträge: 5
Registriert: 23. Jun 2006 2:23

Bash - Datei auslesen

#1 Beitrag von AlPhedo » 23. Jun 2006 2:29

Hi,

ich hab da ein kleines Problem.
Ich will aus einer Datei (beliebig viele Zeilen) immer jede zweite Zeile auslesen. Dazu muss ich ja wissen wieviel Zeilen meine Datei überhaupt hat.
Ich hab es mit

Code: Alles auswählen

var=wc -l $1
versucht das klappt allerdings nicht. Kann mir vielleicht jemand erklären, wie das funktioniert?

mfG Alphedo

Benutzeravatar
jochen
prolinux-forum-admin
Beiträge: 699
Registriert: 14. Jan 2000 15:37
Wohnort: Jülich
Kontaktdaten:

#2 Beitrag von jochen » 23. Jun 2006 5:54

Hi,

nach Deiner Methode müsstest Du schreiben

Code: Alles auswählen

var=`wc -l $1`
oder

Code: Alles auswählen

var=$(wc -l $1)
Beide Schreibweisen bewirken das gleiche: wc wird ausgeführt und der Output der Variablen var zugewiesen.

Meiner Meinung nach hast Du aber den falschen Ansatz. Auf diese Methode musst Du die Datei zweimal durchlesen, einmal mittels wc und einmal mit der Shell. Einmal reicht aber:

Code: Alles auswählen

#!/bin/bash

typeset -i ZEILENZAEHLER=0

while read ZEILE ; do 
    (( ZEILENZAEHLER ++ ))
    if (( ZEILENZAEHLER % 2 == 1 )); then
        echo "Ungerade Zeile"
    else
        echo "Gerade Zeile"
    fi
done < eingabedatei
Wenn Du die gerade eilen lieber im then-Zweig behandeln möchtest, ersetze in der if-Bedingung einfach die 1 durch eine 0 (Null).

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#3 Beitrag von Janka » 23. Jun 2006 8:29

awk ist für sowas gedacht, weil es die Eingabedatei sowieso zeilenweise durchgeht. Dadurch wird das "Programm" sehr simpel:

Code: Alles auswählen

$ awk '&#123; print ; getline &#125;' <Datei
Das Programm "print ; getline" wird für die erste Zeile durchgeführt, was zum Drucken der ersten Zeile, danach zum Einlesen und ignorieren der zweiten Zeile führt -- hinter getline folgt kein weiteres Kommando.

Will man stattdessen die ungeraden Zeilen ausgeben, so nimmt man "getline ; print".

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Benutzeravatar
AlPhedo
Beiträge: 5
Registriert: 23. Jun 2006 2:23

#4 Beitrag von AlPhedo » 23. Jun 2006 10:28

okay jetzt hat es geklappt und ich hab sogar alles verstanden :-)

danke für eure Hilfe

viele Grüße
AlPhedo

Gast

#5 Beitrag von Gast » 25. Jun 2006 2:54

Weniger tut es auch noch

Code: Alles auswählen

#!/bin/sh

while read LINE; do
  echo "U-Zeile&#58; $&#123;LINE&#125;"
  read LINE
  echo "G-Zeile&#58; $&#123;LINE&#125;"
done < eingabedatei
Sollte es jedoch nötig sein, die letzte Zeile auch ohne anhängenden Zeilenvorschub zu fressen, empfehle ich Jankas awk-Version!
Obige sh-Version unterschlägt letzte ungerade ohne NL, Version jochen 23. Jun 2006 5:54 unteschlägt ohne letztes NL gerade+ungerade.

Antworten