Leer un archivo en una matriz usando Bash

Faaiq Bilal 20 junio 2023
  1. Use el método readarray para leer un archivo en una matriz usando Bash
  2. Use el método general para leer un archivo en una matriz usando Bash
Leer un archivo en una matriz usando Bash

Este tutorial cubre algunos métodos para leer líneas de un archivo y cargarlas en una matriz usando Bash.

Primero, veremos el método readarray. Después de eso, veremos un enfoque más general para leer un archivo en una matriz Bash.

Use el método readarray para leer un archivo en una matriz usando Bash

El readarray es una función que viene con Bash 4.0. Este método debería funcionar para todas las versiones de Bash superiores a 4.0.

Si desea ver qué versión de Bash está ejecutando actualmente, puede usar el siguiente comando:

echo ${Bash_VERSION}

Si su versión de Bash es inferior a 4.0, puede saltar al siguiente método, ya que readarray no funcionará para usted.

Usaremos un archivo titulado numbers.txt para todos nuestros ejemplos con el siguiente contenido.

El archivo numbers.txt:

1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1

La sintaxis para leer este archivo y guardar su contenido en una matriz es la siguiente:

readarray -t Arr < numbers.txt

Desglosando la sintaxis, tenemos readarray como el nombre del comando, -t eliminará los caracteres de “nueva línea” y Arr es el nombre de la matriz en la que se escriben los contenidos del archivo. numbers.txt es el nombre del archivo que pretendemos leer.

Cabe señalar que si el archivo que se va a leer no está en la misma carpeta que su secuencia de comandos, se debe proporcionar la ruta completa al archivo.

El contenido de esta matriz se puede leer como se muestra en el siguiente ejemplo:

echo ${Arr[1]}

El código anterior generará la línea en el índice 1 de la matriz, que es la segunda línea del archivo.

La salida es:

2 1

Para imprimir la matriz completa, use la siguiente sintaxis:

echo ${Arr[@]}

La salida para esto será:

1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1

Use el método general para leer un archivo en una matriz usando Bash

La sintaxis del método general es la siguiente:

IFS=$'\r\n' GLOBIGNORE='*' command eval  'ArrName=($(cat filename))'

La lectura de esta matriz tendrá una sintaxis similar a la que se muestra en el ejemplo anterior:

echo ${ArrName[1]}

La línea Bash anterior mostrará el contenido en el índice 1 de la matriz. Sin embargo, si queremos mostrar el contenido de toda la matriz, podemos usar esto:

echo ${ArrName[@]}

Descripción del Método General

El ArrName en la sintaxis general es el nombre de la matriz, mientras que el filename después de cat es el nombre del archivo que se va a leer. Estaremos modificando estas dos variables para nuestro uso personalizado.

El IFS define los caracteres de ruptura, que son \r y \n en este caso. El \r es el retorno de carro, y \n es el carácter de salto de línea.

En la mayoría de los sistemas modernos, verá que \n se usa como un carácter de nueva línea.

El GLOBIGNORE='*' se establece como seguridad para evitar casos extremos extraños con nombres de archivo. Cabe señalar que este comando requiere Bash (y puede que no funcione necesariamente con otros shells como zsh o fish) debido al uso de GLOBIGNORE.

Otro punto esencial a tener en cuenta es que esta solución es significativamente más lenta que readarray. La única razón para usar esto es si su versión de Bash es anterior a la versión 4.0.

Artículo relacionado - Bash File