web-dev-qa-db-fra.com

Lire un fichier ligne par ligne en assignant la valeur à une variable

J'ai le fichier .txt suivant:

Marco
Paolo
Antonio

Je veux le lire ligne par ligne, et pour chaque ligne je veux assigner une valeur de ligne .txt à une variable. En supposant que ma variable est $name, le flux est le suivant:

  • Lire la première ligne du fichier
  • Assigner $name = "Marco"
  • Effectuer des tâches avec $name
  • Lire la deuxième ligne du fichier
  • Assign $name = "Paolo"
610
Marco

Ce qui suit (enregistrer sous rr.sh) lit un fichier transmis comme argument ligne par ligne:

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

Explication:

  • IFS='' (ou IFS=) empêche le rognage des espaces de début et de fin.
  • -r empêche l'interprétation des échappements de barre oblique inverse.
  • || [[ -n $line ]] empêche la dernière ligne d'être ignorée si elle ne se termine pas par un \n (puisque read renvoie un code de sortie différent de zéro lorsqu'il rencontre EOF).

Exécutez le script comme suit:

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

....

1142
cppcoder

Je vous encourage à utiliser le drapeau -r pour read qui signifie:

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

Je cite de man 1 read.

Une autre chose est de prendre un nom de fichier comme argument.

Voici le code mis à jour:

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

L'utilisation du modèle Bash suivant devrait vous permettre de lire une valeur à la fois à partir d'un fichier et de le traiter.

while read name; do
    # Do what you want to $name
done < filename
119
OneWinged
#! /bin/bash
cat filename | while read LINE; do
    echo $LINE
done
60
Gert

De nombreuses personnes ont publié une solution sur-optimisée. Je ne pense pas que ce soit incorrect, mais je pense humblement qu’une solution moins optimisée serait souhaitable pour permettre à tout le monde de comprendre facilement comment cela fonctionne. Voici ma proposition:

#!/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"
20
Raul Luna

Utilisation:

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

Si vous avez défini IFS différemment, vous obtiendrez des résultats impairs.

18
user3546841

Si vous devez traiter à la fois le fichier d'entrée et l'entrée utilisateur (ou tout autre élément de stdin), utilisez la solution suivante:

#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
    read -p "> $line (Press Enter to continue)"
done

Basé sur la réponse acceptée et sur le tutoriel de redirection bash-hackers .

Ici, nous ouvrons le descripteur de fichier 3 pour le fichier transmis comme argument de script et indiquons à read d'utiliser ce descripteur en tant qu'entrée (-u 3). Ainsi, nous laissons le descripteur d’entrée par défaut (0) attaché à un terminal ou à une autre source d’entrée, capable de lire les entrées de l’utilisateur.

9
gluk47

Pour un traitement correct des erreurs:

#!/bin/bash

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

Utiliser l’outil IFS (séparateur de champs interne) dans bash, définit le caractère à utiliser pour séparer les lignes en jetons, inclut par défaut <tab>/<espace>/<newLine>

étape 1: Chargez les données du fichier et insérez-les dans la liste:

# declaring array list and index iterator
declare -a array=()
i=0

# reading file in row mode, insert each line into array
while IFS= read -r line; do
    array[i]=$line
    let "i++"
    # reading from file path
done < "<yourFullFilePath>"

étape 2: maintenant, itérez et imprimez le résultat:

for line in "${array[@]}"
  do
    echo "$line"
  done

index spécifique à l'écho dans un tablea: Accéder à une variable dans un tableau:

echo "${array[0]}"
0
avivamg

Ce qui suit va simplement imprimer le contenu du fichier:

cat $Path/FileName.txt

while read line;
do
echo $line     
done
0
Rekha Ghanate