it-swarm.com.de

bei bash überspringen Sie leere Zeilen, wenn Sie die Datei Zeile für Zeile durchlaufen

Ich durchlaufe eine Datei Zeile für Zeile und füge jedes Word in ein Array ein, und das funktioniert. Es werden jedoch auch leere Zeilen aufgenommen und als Element im Array platziert. Wie kann ich die leeren Zeilen überspringen? 

beispieldatei

      Line 1
line 2

line 3
        line 4 

line 5
   line 6

Mein Code

while read line ; do
            myarray[$index]="$line"
            index=$(($index+1))
    done < $inputfile

Möglicher Pseudo-Code

while read line ; do
           if (line != space);then
            myarray[$index]="$line"
             fi
            index=$(($index+1))
    done < $inputfile
13
MAXGEN

Entfernen Sie zuerst die Leerzeilen mit sed.

for Word in `sed '/^$/d' $inputfile`; do
    myarray[$index]="$Word"
    index=$(($index+1))
done
4
SzG

Sei eleganter:

echo "\na\nb\n\nc" | grep -v "^$"

cat $file | grep -v "^$" | next transformations...
20
Bohdan

Implementieren Sie den gleichen Test wie in Ihrem Pseudo-Code:

while read line; do
    if [ ! -z "$line" ]; then
        myarray[$index]="$line"
        index=$(($index+1))
    fi
done < $inputfile

Der -z Test bedeutet true if empty. ! negiert (d. h. wahr, wenn nicht leer).

Sie können auch Ausdrücke wie [ "x$line" = x ] oder test "x$line" = x verwenden, um zu testen, ob die Zeile leer ist.

Jede Zeile, die Leerzeichen wird nicht enthält, wird jedoch als leer betrachtet. Wenn dies ein Problem ist, können Sie sed verwenden, um solche Zeilen aus der Eingabe (einschließlich leerer Zeilen) zu entfernen, bevor sie an die while-Schleife übergeben werden.

sed '/^[ \t]*$/d' $inputfile | while read line; do
    myarray[$index]="$line"
    index=$(($index+1))
done
13
isedev

cat -b -s file |grep -v '^$'

Ich weiß, dass es gelöst ist, aber ich musste nummerierte Zeilen ausgeben, während leere Zeilen ignoriert wurden. Daher dachte ich daran, sie hier zu platzieren, falls jemand sie benötigt. :)

3

Verwenden Sie grep, um die leeren Zeilen zu entfernen:

for Word in $(cat ${inputfile} | grep -v "^$"); do
   myarray[$index]="${Word}"
   index=$(($index+1))
done
2
NFTX

Diese Version ist im Vergleich zu Lösungen, die externe Befehle wie sed und grep aufrufen, sehr schnell. Außerdem werden Zeilen übersprungen, die nur Leerzeichen enthalten. Die Zeilen müssen nicht leer sein, um übersprungen zu werden.

#!/bin/bash

myarray=()
while read line
do
    if [[ "$line" =~ [^[:space:]] ]]; then
        myarray+=("${line}")
    fi
done < test.txt

for((i = 0; i < ${#myarray[@]}; ++i))
do
    echo ${myarray[$i]}
done
0
Galik