Pregunta Leer un archivo línea por línea asignando el valor a una variable


Tengo el siguiente archivo .txt:

Marco
Paolo
Antonio

Quiero leerlo línea por línea, y para cada línea quiero asignarle un valor de línea .txt a una variable. Suponiendo que mi variable es $name, el flujo es:

  • Leer la primera línea del archivo
  • Asignar $name = "Marco"
  • Haz algunas tareas con $name
  • Leer segunda línea del archivo
  • Asignar $name = "Paolo"

524
2018-06-07 09:49


origen


Respuestas:


Lo siguiente (guardar como rr.sh) lee un archivo pasado como argumento línea por línea:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"

Explicación:

  • IFS='' (o IFS=) evita que se recorte el espacio en blanco anterior / posterior.
  • -r evita que se interpreten los escapes de barra invertida.
  • || [[ -n $line ]] impide que la última línea sea ignorada si no termina con un \n (ya que read devuelve un código de salida distinto de cero cuando encuentra EOF).

Ejecute el script de la siguiente manera:

chmod +x rr.sh
./rr.sh filename.txt

....


969
2018-06-07 09:53



Te animo a usar el -r bandera para read Lo que significa:

-r  Do not treat a backslash character in any special way. Consider each
    backslash to be part of the input line.

Estoy citando de man 1 read.

Otra cosa es tomar un nombre de archivo como argumento.

Aquí está el código actualizado:

#!/usr/bin/bash
filename="$1"
while read -r line
do
    name="$line"
    echo "Name read from file - $name"
done < "$filename"

252
2018-06-07 10:24



El uso de la siguiente plantilla de Bash debería permitirle leer un valor a la vez de un archivo y procesarlo.

while read name
do
    # Do what you want to $name
done < filename

103
2018-06-07 09:55



#! /bin/bash
cat filename | while read LINE
do
echo $LINE
done

50
2018-01-12 11:25



Mucha gente ha publicado una solución que está sobre optimizada. No creo que sea incorrecto, pero creo humildemente que será deseable una solución menos optimizada para permitir que todos entiendan fácilmente cómo funciona esto. Aquí está mi propuesta:

#!/bin/bash
#
# This program reads lines from a file.
#

end_of_file=0
while [[ $end_of_file == 0 ]]
do
  read -r line
  # the last exit status is the 
  # flag of the end of file
  end_of_file=$?
  echo $line
done < "$1"

17
2017-10-16 10:30



Utilizar:

filename=$1
IFS=$'\n'
for next in `cat $filename`
do
    echo "$next read from $filename" 
done
exit 0

Si has establecido IFS de manera diferente obtendrás resultados extraños.


16
2018-04-17 20:40



Para un correcto manejo de errores:

#!/bin/bash

set -Ee    
trap "echo error" EXIT    
test -e ${FILENAME} || exit
while read -r line
do
    echo ${line}
done < ${FILENAME}

6
2017-12-21 19:49