¿Cómo puedo crear una matriz desde la primera línea de múltiples fuentes de texto?

8

Tengo una variedad de rutas a archivos que tienen varias líneas de texto. Me gustaría producir una matriz que se complete con la primera línea de cada archivo procesado de esta manera:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

A lo sumo, solo obtuve un valor en mi matriz. Parece que no puedo obtener la matriz que estoy buscando fuera del ciclo for. He intentado muchas variaciones y me está costando averiguar dónde me estoy equivocando.

dimmech
fuente

Respuestas:

11

Tú querías

lines+=("$line")

+=WORD es la concatenación de cadenas (o adición). Una asignación compuesta +=(...) agrega los valores a la matriz.

Probablemente también desee citar todas sus expansiones variables aquí: linedefinitivamente lo necesita si la línea puede contener espacios en blanco, pero también podría tener problemas en otros lugares.

Michael Homer
fuente
Gracias, tiene sentido ahora por qué en algunos de mis intentos parecía que el resultado era una mezcla de las dos líneas.
dimmech
4

En Bash también puede leer líneas en una matriz directamente. Si selecciona la longitud de la matriz actual ${#lines[@]}como índice de inserción, puede agregarla:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Extracto de la sinopsis

mapfile mapfile [-n count] [-O origin] [-t] [array]

Lea las líneas de la entrada estándar en la matriz variable de matriz indexada [...]. Las opciones, si se proporcionan, tienen los siguientes significados:

  • -n: Copia en la mayoría de las líneas de conteo . Si el recuento es 0, todas las líneas se copian.

  • -O: Comience a asignar a la matriz en el origen del índice . El índice predeterminado es 0.

  • -t: Eliminar una nueva línea final de cada línea leída.

David Foerster
fuente