web-dev-qa-db-fra.com

bash ignore les lignes vierges lors de l'itération ligne par ligne du fichier

Je parcourt un fichier ligne par ligne et mets chaque mot dans un tableau et cela fonctionne. Mais il prend également des lignes vierges et le met comme un élément du tableau. Comment puis-je ignorer les lignes vierges? 

exemple de fichier

      Line 1
line 2

line 3
        line 4 

line 5
   line 6

Mon code

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

Code de pseudo possible

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

Supprimez les lignes vides en premier avec sed.

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

Soyez plus élégant:

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

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

Implémentez le même test que dans votre pseudo-code:

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

Le test -z signifie true if empty. ! nie (c'est-à-dire vrai s'il n'est pas vide).

Vous pouvez également utiliser des expressions telles que [ "x$line" = x ] ou test "x$line" = x pour vérifier si la ligne est vide.

Cependant, toute ligne contenant des espaces ne sera pas sera considérée comme vide. Si cela pose un problème, vous pouvez utiliser sed pour supprimer ces lignes de l'entrée (y compris les lignes vides), avant qu'elles ne soient transmises à la boucle while, comme dans:

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

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

Je sais que c'est résolu, mais je devais sortir des lignes numérotées tout en ignorant les lignes vides, alors j'ai pensé le mettre ici même au cas où quelqu'un en aurait besoin. :)

3
Kostas Andrianos

Utilisez grep pour supprimer les lignes vides:

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

Cette version est très rapide comparée aux solutions qui invoquent des commandes externes telles que sed et grep. Saute également les lignes qui ne contiennent que des espaces, il n'est pas nécessaire que les lignes soient vides pour être ignorées.

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