web-dev-qa-db-fra.com

lire les entrées d'un fichier et ajouter ces valeurs aux variables à l'aide de shell

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

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 script Shell, je définirai 5 variables, a, b, c, d, e.

Première itération:

Les valeurs de variable doivent être attribuées avec 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 de variable doivent être attribuées avec la deuxième ligne du fichier d'entrée.

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

Etc...

Quelqu'un peut-il expliquer comment écrire un script pour lire les valeurs dans ce format?.

2
harsha

Vous pouvez utiliser la commande intégrée read avec l'option _-a_ avec une boucle pour lire chaque ligne du fichier sous forme de tableau. Vous pouvez ensuite 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 alimentera les variables avec de nouvelles valeurs lors de son appel. La fonction a un paramètre d’entrée qui détermine quelle ligne du fichier doit être analysée.

_#!/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
_

Remarques:

3
pa4080