Bash: Lire une ligne de fichier séparée par des tabulations dans un tableau

Je voudrais lire un fichier dans un script, ligne par ligne. Chaque ligne du fichier contient plusieurs valeurs séparées par un onglet, j’aimerais lire chaque ligne dans un tableau.

Exemple de bash typique “lire fichier par ligne”;

while read line do echo $line; done < "myfile" 

Pour moi, mon fichier ressemble à ceci (valeurs séparées par des tabulations);

 value1 value2 value3 value4 value5 value6 

A chaque itération de la boucle, je voudrais que chaque ligne entre dans un tableau afin que je puisse

 while read line into myArray do echo myArray[0] echo myArray[1] echo myArray[2] done < "myfile" 

Cela afficherait ce qui suit sur la première itération de la boucle;

 value1 value2 value3 

Ensuite, à la deuxième itération, il imprimerait

 value4 value5 value6 

Est-ce possible? La seule façon que je peux voir est d’écrire une petite fonction pour séparer les valeurs manuellement, y a-t-il un support intégré dans bash pour cela?

Tu es très proche:

 while IFS=$'\t' read -r -a myArray do echo "${myArray[0]}" echo "${myArray[1]}" echo "${myArray[2]}" done < myfile 

( -r indique read que \ n'est pas spécial dans les données d'entrée; -a myArray dit de diviser la ligne d'entrée en mots et de stocker les résultats dans myArray ; et IFS=$'\t' dit de utilisez uniquement des tabulations pour séparer les mots, au lieu de la valeur par défaut de Bash standard, qui permet également aux espaces de fractionner des mots. "dans les positions antérieures dans le tableau. Est-ce correct?)

Si vous voulez vraiment diviser chaque mot (sens de bash) en un index de tableau différent en changeant complètement le tableau à chaque itération de boucle, la réponse de @ ruakh est la bonne approche. Mais vous pouvez utiliser la propriété read pour diviser chaque mot lu en différentes variables column1 , column2 , column3 comme dans cet extrait de code

 while IFS=$'\t' read -r column1 column2 column3 ; do printf "%b\n" "column1<${column1}>" printf "%b\n" "column2<${column2}>" printf "%b\n" "column3<${column3}>" done < "myfile" 

pour obtenir un résultat similaire en évitant l'access à l'index de tableau et en améliorant la lisibilité de votre code en utilisant des noms de variables significatifs (bien sûr, l'utilisation de columnN n'est pas une bonne idée).

Vous pourriez aussi essayer,

 OIFS=$IFS; IFS="\t"; animals=`cat animals.txt` animalArray=$animals; for animal in $animalArray do echo $animal done IFS=$OIFS;