varias usan una texto tabuladores tabulaciones por misma los linea hacer delimitado como arrays bash

arrays - usan - tabulaciones en word 2016



Lea la lĂ­nea de archivo separada por tabulaciones en la matriz (3)

Estás muy cerca:

while IFS=$''/t'' read -r -a myArray do echo "${myArray[0]}" echo "${myArray[1]}" echo "${myArray[2]}" done < myfile

(La -r dice que / no es especial en los datos de entrada; la -a myArray le dice que divida la línea de entrada en palabras y almacene los resultados en myArray ; y la IFS=$''/t'' le dice a use solo las pestañas para dividir las palabras, en lugar del valor predeterminado normal de Bash también permite que los espacios también dividan las palabras. Tenga en cuenta que este enfoque tratará una o más pestañas como delimitador, por lo que si algún campo está en blanco, los campos posteriores se cambiarán "en posiciones anteriores en la matriz. ¿Está bien?)

Me gustaría leer un archivo en un script, línea por línea. Cada línea del archivo tiene varios valores separados por una pestaña, me gustaría leer cada línea en una matriz.

Ejemplo típico de bash "leer archivo por línea";

while read line do echo $line; done < "myfile"

Para mí, sin embargo, myfile tiene este aspecto (valores separados por tabulaciones);

value1 value2 value3 value4 value5 value6

En cada iteración del bucle, me gustaría que cada línea entrara en una matriz para poder

while read line into myArray do echo myArray[0] echo myArray[1] echo myArray[2] done < "myfile"

Esto imprimiría lo siguiente en la primera iteración del bucle;

value1 value2 value3

Luego en la segunda iteración se imprimiría

value4 value5 value6

es posible? La única manera que puedo ver es escribir una pequeña función para desglosar los valores manualmente, ¿hay soporte integrado en bash para esto?


Si realmente desea dividir cada palabra (significado bash) en un índice de matriz diferente, cambiando completamente la matriz en cada iteración de bucle while, la respuesta de @ ruakh es el enfoque correcto. Pero puede usar la propiedad de lectura para dividir cada palabra leída en diferentes variables column1 , column2 , column3 como en este fragmento de código

while IFS=$''/t'' read -r column1 column2 column3 ; do printf "%b/n" "column1<${column1}>" printf "%b/n" "column2<${column2}>" printf "%b/n" "column3<${column3}>" done < "myfile"

para alcanzar un resultado similar evitando el acceso al índice de matriz y mejorando la legibilidad de su código mediante el uso de nombres de variables significativos (por supuesto, el uso de columnN no es una buena idea).


También podrías intentarlo,

OIFS=$IFS; IFS="/t"; animals=`cat animals.txt` animalArray=$animals; for animal in $animalArray do echo $animal done IFS=$OIFS;