J'ai un fichier nommé /tmp/urlFile
où chaque ligne représente une URL. J'essaie de lire le fichier comme suit:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Si la dernière ligne ne se termine pas par un caractère de nouvelle ligne, cette ligne ne sera pas lue. Je me demandais pourquoi?
Est-il possible de lire toutes les lignes, qu'elles se terminent par une nouvelle ligne ou non?
awk 1 /tmp/urlFile
.. soawk 1 /tmp/urlFile | while ...
Réponses:
Vous feriez:
(en fait, cette boucle ajoute la nouvelle ligne manquante sur la dernière (non) ligne).
Voir également:
la source
printf
appels ici l'ont\n
.Cela semble être résolu en partie avec
readarray -t
:Notez cependant que bien que cela fonctionne pour les fichiers de taille raisonnable, cette solution introduit un nouveau problème potentiel avec les fichiers très volumineux - elle lit d'abord le fichier dans un tableau qui doit ensuite être itéré. Pour les fichiers très volumineux, cela pourrait prendre du temps et de la mémoire, potentiellement jusqu'à l'échec.
la source
Par définition , un fichier texte se compose d'une séquence de lignes. Une ligne se termine par un caractère de nouvelle ligne. Ainsi, un fichier texte se termine par un caractère de nouvelle ligne, sauf s'il est vide.
La fonction
read
intégrée est uniquement destinée à lire des fichiers texte. Vous ne passez pas un fichier texte, vous ne pouvez donc pas espérer qu'il fonctionne de manière transparente. Le shell lit toutes les lignes - ce qu'il saute sont les caractères supplémentaires après la dernière ligne.Si vous avez un fichier d'entrée potentiellement mal formé qui peut manquer sa dernière ligne, vous pouvez lui ajouter une nouvelle ligne, juste pour être sûr.
Les fichiers qui devraient être des fichiers texte mais qui manquent la nouvelle ligne finale sont souvent produits par les éditeurs de Windows. Cela va généralement en combinaison avec les fins de ligne Windows, qui sont CR LF, par opposition au LF d'Unix. Les caractères CR sont rarement utiles n'importe où et ne peuvent en aucun cas apparaître dans les URL, vous devez donc les supprimer.
Dans le cas où le fichier d'entrée est bien formé et se termine par une nouvelle ligne, l'
echo
ajoute une ligne vierge supplémentaire. Étant donné que les URL ne peuvent pas être vides, ignorez simplement les lignes vides.Notez également que
read
ne lit pas les lignes d'une manière simple. Il ignore les espaces de début et de fin, ce qui est probablement souhaitable pour une URL. Il traite la barre oblique inversée à la fin d'une ligne comme un caractère d'échappement, provoquant la jonction de la ligne suivante avec la première moins la séquence barre oblique inverse-nouvelle ligne, ce qui n'est certainement pas souhaitable. Vous devez donc transmettre l'-r
option àread
. Il est très, très rare que ceread
soit la bonne choseread -r
.la source
Eh bien,
read
retourne une valeur falsifiée si elle rencontre la fin du fichier avant une nouvelle ligne, mais même si c'est le cas, elle affecte toujours la valeur lue. Ainsi, nous pouvons vérifier si l'appel final deread
renvoie autre chose qu'une ligne vide et le traiter normalement. Donc, ne quittez la boucle qu'aprèsread
retourne false et la ligne est vide:la source
Une autre façon serait la suivante:
Référé d' ici .
la source
Ceci est une utilisation inutile de
cat
.Ironiquement, vous pouvez remplacer le
cat
processus ici par quelque chose de réellement utile: un outil dont disposent les systèmes POSIX pour ajouter la nouvelle ligne manquante et transformer le fichier en un fichier texte POSIX approprié.Lectures complémentaires
la source
read
est spécifié dans ces cas.