Cómo leer un archivo línea por línea

última actualización el 11 de agosto de 2008, 19:00 por Carlos-vialfa
Publicado por Carlos-vialfa

Cómo leer un archivo línea por línea




Preámbulo


Uno de los errores más comunes cuando se aprende a utilizar los scripts “bash” bajo GNU/Linux para leer un archivo línea por línea, es el utilizar un bucle “for”, (for line in $(cat file.txt); do ...) lo que conduce a una evaluación de cada palabra y no de cada línea, que es lo que se busca.

Ejemplo de un bucle “for”:
for line in $(cat file.txt); do echo "$line" ; done
Esta
Es 
La 
Línea
n°
1
Esta
Es 
La 
Línea
n°
2
Esta
[...]

La solución consiste en utilizar un bucle “while” asociado al comando interno “read”.

Sin embargo, también podemos obtener el mismo resultado con un bucle “for” con la condición de que cambiemos el valor de la variable "$IFS" (Internal Field Separator, separador de campo interno) antes de ejecutar el bucle. Es lo que veremos a continuación.

Bucle while


El bucle “while” sigue siendo el método más apropiado y simple para leer un archivo línea por línea.

Sintaxis


while read linea
do
   comando
done < archivo

Ejemplo


El archivo de inicio:
Esta es la línea n° 1
Esta es la línea n° 2
Esta es la línea n° 3
Esta es la línea n° 4
Esta es la línea n° 5

Las instrucciones en línea de comandos:
while read line; do echo -e "$line\n"; done < file.txt

o en un script “bash”:
#! /bin/bash

while read line
do 
   echo -e "$line\n"
done < file.txt

La salida en la pantalla será (stdout):
Esta es la línea n° 1
Esta es la línea n° 2
Esta es la línea n° 3
Esta es la línea n° 4
Esta es la línea n° 5

Trucos


También podemos a partir de un archivo estructurado (como una libretas de direcciones o /etc/passwd por ejemplo) obtener los valores de cada campo y asignarlos a varias variables con el comando “read”. Sin embargo hay que tener cuidado de asignar a la variable “IFS” el separador de campo adecuado (espacio por defecto).

Ejemplo:
#! /bin/bash

while IFS=: read user pass uid gid full home shell
do
echo -e "$full :\n\
	Pseudo : $user\n\
	UID :\t $uid\n\
	GID :\t $gid\n\
	Home :\t $home\n\
	Shell :\t $shell\n\n"
done < /etc/passwd

Complemento


while read i; do echo -e "parametro : $i"; done < <(echo -e "a\nab\nc")

Bucle for


Si bien es cierto que el bucle “while” es el método más simple, sin embargo este tiene un gran inconveniente, el de eliminar el formateado de las líneas y especialmente los espacios y tabulaciones.
Felizmente el bucle “for” asociado a un cambio de IFS permite conservar la estructura del documento a la salida.

Sintaxis


oldIFS=$IFS     # conserva el separador de campo
IFS=$'\n'     # nuevo separador de campo, el caracter fin de línea
for línea in $(cat archivo)
do
   comando
done
IFS=$old_IFS     # restablece el separador de campo predeterminado


PD: El artículo original fue escrito por jipicy contribuidor de CommentCaMarche
Mejores respuestas para « Cómo leer un archivo línea por línea » en :
[MS-Dos] Listar el contenido de un directorio en un archivo Ver En ocasiones puede ser útil listar el contenido uno o varios directorios en un archivo, por ejemplo para tener un catalogo de archivos. Bajo MS-DOS (o bajo Windows en el símbolo del sistema) es posible enviar la salida de un comando a un archivo...
[Grabación] Grabar o leer un archivo .img / .ccd / .sub Ver Los archivos con extensión .img, .ccd y .sub son respectivamente: IMG: una imagen de un CD, es decir un archivo conteniendo una copia binaria de un CD o DVD. CCD y SUB: información sobre las pistas del disco. Los archivos .IMG son utilizados...
[Grabar] Grabar o reproducir un archivo .NRG VerUn archivo .NRG es una imagen de disco, es decir una copia binaria de un CD o de un DVD bajo la forma de un archivo. Los archivos .NRG son utilizados por los programas de grabación o por los reproductores de discos virtuales (como Daemon...
[Vista] Tomar posesión de un archivo cuyo acceso es denegado VerMuchas veces obtenemos el mensaje “Acceso denegado” cuando queremos modificar un archivo o una carpeta que están bloqueados y de los que no somos propietarios. Existen dos métodos para resolver este problema: Método 1 Método 2: en...
Cómo reproducir un archivo RMVB VerLa extensión RMVB (Real Media Variable Bitrate) es una extensión para Real Player; para poder ver los archivos con esta extensión debemos tener los codecs Real Player. Puedes descargar el reproductor Real Player del siguiente enlace: Descargar Real...
Linux - Shell VerIntroducción a la shell El intérprete de comandos es la interfaz entre el usuario y el sistema operativo. Por esta razón, se le da el nombre inglés "shell", que significa "caparazón". Por lo tanto, la shell actúa como un intermediario entre el...
Comandos de Linux VerTabla de los comandos principales de Linux Comando Descripción Equivalente a DOS ls listas del contenido de un directorio dir cd cambio de directorio cd cd .. directorio principal cd.. mkdir crea un...
Codificación BinHex VerCodificación BinHex La codificación BinHex (que es la abreviatura de binaria a hexadecimal) es un algoritmo patentado por Apple que sirve para convertir datos binarios de 8 bits a un formato de 7 bits. La codificación BinHex, diseñada para los...