Leer un archivo en una matriz usando Bash
-
Use el método
readarray
para leer un archivo en una matriz usando Bash - Use el método general para 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.