2 votes

lire les entrées d'un fichier et ajouter ces valeurs aux variables en utilisant Shell.

J'essaie d'écrire un bash script pour lire un fichier en entrée et y ajouter le valeurs/données de ce fichier dans des variables et les valeurs des variables doivent être mises à jour à chaque itération en fonction de la ligne d'entrée du fichier.

Par exemple, le fichier d'entrée ressemble à ce qui suit :

100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

En lisant ceci à travers mon Shell Shell, je vais définir 5 variables disons a,b,c,d,e.

Première itération :

Les valeurs des variables doivent être assignées à la première ligne du fichier d'entrée.

a=100
b=Thomas
c=Manager
d=Sales
e=$5000

Deuxième itération :

Les valeurs des variables doivent être assignées à la deuxième ligne du fichier d'entrée.

a=200
b=Jason
c=Developer
d=Technology
e=$5500

Et ainsi de suite...

S'il vous plaît, que quelqu'un me dise comment écrire un script pour lire les valeurs dans ce format.

3voto

pa4080 Points 27038

Vous pouvez utiliser le read commande intégrée avec option -a avec une boucle pour lire chaque ligne du fichier comme un tableau. Ensuite, vous pouvez affecter la valeur des éléments du tableau aux variables dont vous avez besoin (ou vous pouvez utiliser les éléments du tableau directement dans votre script) :

#!/bin/bash

IN_FILE='./in-file.txt'

while read -ra LINE
do
        a="${LINE[0]}"; b="${LINE[1]}"; c="${LINE[2]}"
        d="${LINE[3]}"; e="${LINE[4]}"

        echo -e "$a\n$b\n$c\n$d\n$e\n"

done < "$IN_FILE"

Une autre méthode consiste à affecter les valeurs de chaque colonne de certaines lignes directement aux variables. L'exemple suivant utilise la fonction bash qui va alimenter les variables avec nouveau lorsqu'il est appelé. La fonction a un paramètre d'entrée, qui détermine la ligne du fichier à analyser.

#!/bin/bash

IN_FILE='./in-file.txt'

args_feed() {
        read -r a b c d e <<< "$(sed "$1 q;d" "$IN_FILE")"
}

# -----------------
# Examples of usage
# -----------------

# Parse the third line
args_feed 3
echo -e "$a\n$b\n$c\n$d\n$e\n"

# Sequential call - First iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"

# Sequential call - Second iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"

# Parse the entire file
NR_LINES="$(cat "$IN_FILE" | wc -l)"
for LINE_NR in $(seq 1 $NR_LINES)
do
        args_feed "$LINE_NR"
        echo -e "$a\n$b\n$c\n$d\n$e\n"
done

Notes :

  • La valeur par défaut de $IFS sont les espaces et les tabulations, ce qui est applicable dans ce cas. Pour plus de détails, veuillez lire cette réponse encyclopédique .

  • Le site -r utilisée dans les deux exemples, passée à read empêche les échappements de barres obliques inversées d'être interprétés.

  • Selon l'usage de sed dans le deuxième exemple, lire cette réponse .

  • Pour d'autres exemples, veuillez consulter la version previews de la réponse.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X