277 votes

bash: Lire des lignes dans le fichier dans un tableau

Je suis en train de lire un fichier contenant des lignes dans un tableau bash.

J'ai essayé ce qui suit:

Attempt1

a=( $( cat /path/to/filename ) )

Tentative2 a

index=0
while read line ; do
    MYARRAY[$index]="$line"
    index=$(($index+1))
done < /path/to/filename

Les deux tentative échoue, parce qu'ils ne retournent un élément de tableau contenant la première ligne du fichier. Ce que je fais mal?

Je suis en cours d'exécution bash 4.1.5

407voto

chepner Points 54078

L' readarray de commande (également orthographié mapfile) a été introduit en bash 4, je crois.

readarray a < /path/to/filename

149voto

nhed Points 2155

Utilisation de $IFS qui n'a pas d'espaces\onglets, juste des retours à la ligne/CR

$ IFS=$'\r\n' GLOBIGNORE='*' :; XYZ=($(cat /etc/passwd))
$ echo "${XYZ[5]}"
sync:x:5:0:sync:/sbin:/bin/sync

Notez également que vous pouvez être en paramètre le tableau très bien, mais la lecture de ce mal - être assurez-vous d'utiliser à la fois des guillemets "" et les accolades {} comme dans l'exemple ci-dessus


Edit:

Pouvez également suivre drizzt la suggestion ci-dessous et de le remplacer une fourche shell interne est exécuté+chat

$(</etc/passwd)

L' :; ci-dessus est un no-op qui adresses @gniourf_gniourf préoccupations au sujet de la portée mondiale de réglage de la FI & GLOBIGNORE. L'autre option que j'utilise parfois est mise FI dans XIFS, puis restaurer après. Voir aussi Sorpigal la réponse qui n'a pas besoin de s'embêter avec ce

148voto

Sorpigal Points 10412

La façon la plus simple pour lire chaque ligne d'un fichier dans une bash tableau est ceci:

IFS=$'\n' read -d '' -r -a lines < /etc/passwd

Maintenant, juste de l'indice dans le tableau lines pour récupérer chaque ligne, par exemple

printf "line 1: %s\n" "${lines[0]}"
printf "line 5: %s\n" "${lines[4]}"

# all lines
echo "${lines[@]}"

28voto

Karanjot Points 29

Une autre façon si le fichier contient des chaînes de caractères sans espaces avec 1string chaque ligne:

fileItemString=$(cat  filename |tr "\n" " ")

fileItemArray=($fileItemString)

Vérifier:

Imprimer tout le Tableau:

${fileItemArray[*]}

Length=${#fileItemArray[@]}

4voto

#!/bin/bash
IFS=$'\n' read  -d'' -r -a inlines  < testinput
IFS=$'\n' read  -d'' -r -a  outlines < testoutput
counter=0
cat testinput | while read line; 
do
    echo "$((${inlines[$counter]}-${outlines[$counter]}))"
    counter=$(($counter+1))
done
# OR Do like this
counter=0
readarray a < testinput
readarray b < testoutput
cat testinput | while read myline; 
do
    echo value is: $((${a[$counter]}-${b[$counter]}))
    counter=$(($counter+1))
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X