Bash - Datei auslesen

Post Reply
Message
Author
User avatar
AlPhedo
Posts: 5
Joined: 23. Jun 2006 2:23

Bash - Datei auslesen

#1 Post by AlPhedo »

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: Select all

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

mfG Alphedo

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#2 Post by jochen »

Hi,

nach Deiner Methode müsstest Du schreiben

Code: Select all

var=`wc -l $1`
oder

Code: Select all

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: Select all

#!/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..."

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#3 Post by Janka »

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

Code: Select all

$ 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.

User avatar
AlPhedo
Posts: 5
Joined: 23. Jun 2006 2:23

#4 Post by AlPhedo »

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

danke für eure Hilfe

viele Grüße
AlPhedo

Gast

#5 Post by Gast »

Weniger tut es auch noch

Code: Select all

#!/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.

Post Reply