Tengo un archivo llamado /tmp/urlFile
donde cada línea representa una url. Estoy tratando de leer del archivo de la siguiente manera:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Si la última línea no termina con un carácter de nueva línea, esa línea no se leerá. Me preguntaba por qué?
¿Es posible leer todas las líneas, independientemente de si terminaron con una nueva línea o no?
awk 1 /tmp/urlFile
.. soawk 1 /tmp/urlFile | while ...
Respuestas:
Tu harías:
(efectivamente, ese bucle vuelve a agregar la nueva línea que falta en la última línea (no)).
Ver también:
fuente
printf
llamadas aquí tienen\n
.Esto parece resolverse en parte con
readarray -t
:Sin embargo, tenga en cuenta que si bien esto funciona para archivos de tamaño razonable, esta solución presenta un nuevo problema potencial con archivos muy grandes: primero lee el archivo en una matriz que luego debe iterarse. Para archivos muy grandes, esto puede llevar mucho tiempo y memoria, potencialmente hasta el punto de falla.
fuente
Por definición , un archivo de texto consiste en una secuencia de líneas. Una línea termina con un carácter de nueva línea. Por lo tanto, un archivo de texto termina con un carácter de nueva línea, a menos que esté vacío.
El
read
builtin solo está destinado a leer archivos de texto. No está pasando un archivo de texto, por lo que no puede esperar que funcione sin problemas. El shell lee todas las líneas; lo que se salta son los caracteres adicionales después de la última línea.Si tiene un archivo de entrada potencialmente malformado que le puede faltar su última línea, puede agregarle una nueva línea, solo para estar seguro.
Los archivos que deberían ser archivos de texto pero que faltan en la nueva línea final a menudo son producidos por editores de Windows. Esto generalmente se combina con las terminaciones de línea de Windows, que son CR LF, en oposición a las LF de Unix. Los caracteres CR rara vez son útiles en cualquier lugar, y no pueden aparecer en las URL en ningún caso, por lo que debe eliminarlos.
En caso de que el archivo de entrada esté bien formado y termine con una nueva línea,
echo
agrega una línea en blanco adicional. Como las URL no pueden estar vacías, simplemente ignore las líneas en blanco.Tenga en cuenta también que
read
no lee líneas de una manera directa. Ignora los espacios en blanco iniciales y finales, lo que para una URL es probablemente deseable. Trata la barra invertida al final de una línea como un carácter de escape, lo que hace que la siguiente línea se una con la primera menos la secuencia barra invertida-nueva línea, lo que definitivamente no es deseable. Por lo tanto, debe pasar la-r
opción aread
. Es muy, muy raroread
que sea lo correcto en lugar de hacerloread -r
.fuente
Bueno,
read
devuelve un valor falso si se encuentra con el final del archivo antes de una nueva línea, pero incluso si lo hace, todavía asigna el valor que leyó. Por lo tanto, podemos verificar si la llamada final deread
devuelve algo más que una línea vacía y procesarla de manera normal. Entonces, solo salga del ciclo después de queread
devuelva falso y la línea esté vacía:fuente
Otra forma sería así:
Referido desde aquí .
fuente
Este es un uso inútil de
cat
.Irónicamente, puede reemplazar el
cat
proceso aquí con algo realmente útil: una herramienta que tienen los sistemas POSIX para agregar la nueva línea faltante y convertir el archivo en un archivo de texto POSIX adecuado.Otras lecturas
fuente
read
se especifica en esos casos.