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
Supprimez les lignes vides en premier avec sed
.
for Word in `sed '/^$/d' $inputfile`; do
myarray[$index]="$Word"
index=$(($index+1))
done
Soyez plus élégant:
echo "\na\nb\n\nc" | grep -v "^$"
cat $file | grep -v "^$" | next transformations...
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
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. :)
Utilisez grep pour supprimer les lignes vides:
for Word in $(cat ${inputfile} | grep -v "^$"); do
myarray[$index]="${Word}"
index=$(($index+1))
done
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