Sunteți pe pagina 1din 4

Cmo leer un archivo lnea por lnea

Junio 2014

Cmo leer un archivo lnea por lnea
Prembulo
Bucle while
Sintaxis
Ejemplo
Trucos
Complemento
Bucle for
Sintaxis

Prembulo
Uno de los errores ms comunes cuando se aprende a utilizar los scripts bash bajo GNU/Linux
para leer un archivo lnea por lnea, es el utilizar un bucle for, (for line in $(cat file.txt); do ...) lo
que conduce a una evaluacin de cada palabra y no de cada lnea, que es lo que se busca.
Ejemplo de un bucle for:
for line in $(cat file.txt); do echo "$line" ; done
Esta
Es
La
Lnea
n
1
Esta
Es
La
Lnea
n
2
Esta
[...]
La solucin consiste en utilizar un bucle while asociado al comando interno read. Sin
embargo, tambin podemos obtener el mismo resultado con un bucle for con la condicin 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 continuacin.
Bucle while
El bucle while sigue siendo el mtodo ms apropiado y simple para leer un archivo lnea por
lnea.
Sintaxis
while read linea
do
comando
done < archivo

Ejemplo
El archivo de inicio:
Esta es la lnea n 1
Esta es la lnea n 2
Esta es la lnea n 3
Esta es la lnea n 4
Esta es la lnea n 5
Las instrucciones en lnea 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 lnea n 1
Esta es la lnea n 2
Esta es la lnea n 3
Esta es la lnea n 4
Esta es la lnea n 5

Trucos
Tambin 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 mtodo ms simple, sin embargo este tiene un gran
inconveniente, el de eliminar el formateado de las lneas 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 lnea
for lnea in $(cat archivo)
do
comando
done
IFS=$old_IFS # restablece el separador de campo predeterminado
Este documento intitulado Cmo leer un archivo lnea por lnea de Kioskea (es.kioskea.net) esta puesto a
diposicin bajo la licencia Creative Commons. Puede copiar, modificar bajo las condiciones puestas por la licencia,
siempre que esta nota sea visible.

S-ar putea să vă placă și