bash ignorer les lignes vides lors d'une itération dans le fichier ligne par ligne
Je suis une itération dans un fichier ligne par ligne et de mettre chaque mot dans un tableau et qui fonctionne. Mais il reprend aussi des lignes vides et l'enfile comme un élément d'un tableau, comment puis-je ignorer les lignes vides?
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
Possible pseudo code
while read line ; do
if (line != space);then
myarray[$index]="$line"
fi
index=$(($index+1))
done < $inputfile
OriginalL'auteur MAXGEN | 2014-02-27
Vous devez vous connecter pour publier un commentaire.
Supprimer les lignes vides d'abord avec
sed
.OriginalL'auteur SzG
Être plus élégant:
cat
àgrep
? Ne serait pasgrep -v "^$" "$inputfile"
faire aussi bien?Depuis la sortie est destinée à être rattachée à une autre opération, il est plus agréable de tuyau dans le fichier d'entrée que pour la distribution, comme un argument. De cette façon, vous pouvez lire le flux de données directement à partir de la gauche vers la droite, plutôt que de démarrer-dans-le-milieu-aller à gauche puis sautez à droite. Certes, il gaspille 4 personnages et de quelques millisecondes, mais je ne pense pas que c'est une grande affaire. Aussi, de le présenter de cette manière rend facile il vous suffit de changer la première étape du pipeline si l'entrée est à venir à partir de quelque part d'autre.
$file
devrait vraiment être entre guillemets ici. Il n'ya aucune garantie que le nom de fichier ne sera pas contenir d'espaces.Il n'est pas clair pour moi comment les OP pourront utiliser cette réponse. Remplacer la dernière ligne pour
$inputfile
?"élégance" et
cat ... | grep
sont généralement considérés comme contradictoires (depuis "élégant" est elle-même subjective);cat
àgrep
est généralement considéré comme une mauvaise forme. Si vous voulez atteindre le but de mettre simplement le fichier d'entrée en premier, le même effet peut être obtenu sans les traiter par le biais d'< "$file" grep "pattern..." | cmd | ...
OriginalL'auteur Bohdan
Mettre en œuvre le même test que dans votre pseudo-code:
La
-z
testtrue if empty
.!
nie (c'est à dire vrai, si ce n'est pas vide).Vous pouvez également utiliser des expressions comme
[ "x$line" = x ]
outest "x$line" = x
pour tester si la ligne est vide.Cependant, toute la ligne qui contient les espaces ne être considéré comme vide. Si c'est un problème, vous pouvez utiliser
sed
pour supprimer ces lignes de l'entrée (y compris les lignes vides), avant qu'ils sont passés à lawhile
boucle, comme dans:if [ "$line" ]; then
oui, ça marche sur Linux/bash... pas sûr d'autres ancienne / Unix et de coquillages. Le autoconf outils spécifiquement l'utilisation de la
test "x$line" = x
forme pour max. la portabilité.Pourrais-je ajouter quelque chose à sed? Si il y a un espace vide avant la première lettre dans une ligne à supprimer l'espace ou les espaces jusqu'à la première lettre de la ligne?
eh bien, vous pourriez utiliser:
sed -e '/^[ \t]*$/d' -e 's/^[ \t]*//'
pour supprimer vide ou tous les espaces des lignes de et pour supprimer tous les leaders d'espace avant non-blanc en ligne.Copiez votre code jusqu'en haut, est-ce correct? Je ne suis pas d'obtenir de bons résultats.
OriginalL'auteur isedev
cat -b -s file |grep -v '^$'
Je sais que c'est résolu, mais, j'avais besoin de la sortie de lignes numérotées en ignorant les lignes vides, j'ai donc pensé à mettre ça ici au cas où quelqu'un en a besoin. 🙂
cat
(qui reformate la sortie plus que celle généralement veut),grep
pouvez également ajouter des numéros de ligne. Si l'appariement de chaque ligne, pas de numéros sont ignorés: par exemple,grep -v '^$' file | grep -n .
(vous pouvez convertir le côlon (:
) à quelque chose d'autre parsed
)OriginalL'auteur Kostas Andrianos
Utiliser grep pour supprimer les lignes vides:
cat
àgrep
? Ne serait pasgrep -v "^$" "$inputfile"
faire aussi bien?Les deux sont corrects. J'ai simplement utilisé l'utilisation de 'chat', parce que parfois j'ai besoin de l'utilisation de l'écho "au lieu de "chat".
en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat
OriginalL'auteur NFTX
Cette version est très rapide par rapport à des solutions d'appeler des commandes externes comme
sed
etgrep
. Aussi est saute les lignes ne contenant que des espaces, les lignes n'ont pas besoin d'être vide pour être ignorée.OriginalL'auteur Galik