Linux: analiza un archivo txt en una matriz usando bash y awk

CorePress2024-01-24  9

Esta pregunta ya tiene respuestas aquí: Bash captura la salida de awk en una matriz

(2 respuestas)

Cerrado

hace 2 años

.

Tengo el siguiente archivo CSV llamado test.csv

First Line, 100
Second Line, 200
Third Line, 300
Fourth Line, 400

Quiero dividir cada línea por coma y almacenar la primera parte en una matriz en un script bash usando awk. He hecho lo siguiente:

#!/bin/bash
declare -a MY_ARRAY

MY_ARRAY=$(awk -F ',' '{print }' test.csv)
echo 'Start'
for ENTRY in ${MY_ARRAY}
do
echo ${ENTRY}
done
echo 'Stop'

Yel resultado es el siguiente:

Start
First
Line
Second
Line
Third
Line
Fourth
Line
Stop

¿Cómo puedo hacer que la matriz contenga lo siguiente?:

First Line
Second Line
Third Line
Fourth Line

¿Por qué quieres usar awk para completar una matriz bash? En todos los casos, sería más fácil utilizar bash directamente. Debido a los espacios dentro de los campos, necesitas más código bash que array=( $(awk ...) ) de todos modos (nota el ( ) alrededor de $( )`; los olvidaste).

- Socowi

27 de marzo de 2021 a las 0:01

algunos problemas con el código actual: a) la asignación de valores a una matriz generalmente requiere ajustar el lado derecho de la asignación en padres, por ejemplo, MY_ARRAY=( $(awk ... ) ); b) dado que las líneas de salida de awk contienen espacios en blanco, debe redefinir el separador de campo predeterminado como \n para un análisis adecuado de la matriz, por ejemplo, IFS=$'\n' MY_ARRAY=( $(awk ... ) ) (todo en una línea, por lo que la redefinición de IFS solo se aplica a este comando); c) para hacer referencia a los elementos individuales de la matriz, necesita una coincidencia comodín para el índice (envuelto entre []'s), por ejemplo, para ENTRY en "${MY_ARRAY[@]}"

-markp-fuso

27/03/2021 a las 15:18



------------------------------------

Si desea asignar una matriz bash a las primeras columnas del archivo csv, no es necesario utilizar awk. Intente en su lugar:

readarray -t my_array < <(cut -d, -f1 test.csv)
for e in "${my_array[@]}"; do
    echo "$e"
done

Salida:

First Line
Second Line
Third Line
Fourth Line
El comando cut -t, -f1 file divide cada línea en coma e imprime el primer campo. La expresión <(comando) es una sustitución de proceso y puede redirigir el salida del comando a otro comando (readarray en este caso). El comando readarray -t my_array lee líneas de la entrada estándar y asigna my_array a las líneas.

Volviendo al script publicado, la variable MY_ARRAY no es culofirmado como una matriz. Solo contiene una sola cadena que contiene espacios en blanco. y nuevas líneas. Si se hace referencia a ENTRY en ${MY_ARRAY}, la cadena está dividido en los espacios en blanco y las nuevas líneas debido a la división de palabras de bash.



------------------------------------

$ cat input 
First Line, 100
Second Line, 200
Third Line, 300
Fourth Line, 400

$ cat so.sh 
#!/bin/bash

while IFS=',' read -r -a array; do
    echo $array
done

$ cat input | ./so.sh 
First Line
Second Line
Third Line
Fourth Line


2

Necesito el script para abrir el archivo y leerlo, no tenerlo modificado parael guión

-Harry Boy

27 de marzo de 2021 a las 0:42

@HarryBoy Pero así es como se lee un archivo en bash.

- Eric Schaefer

27 de marzo de 2021 a las 9:22

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare