Después de muchas pruebas y errores, en realidad encuentro la matriz multidimensional mejor, más clara y más fácil en bash es usar una var. Sí.
Ventajas: No tiene que recorrer una gran matriz, solo puede repetir "$ var" y usar grep/awk/sed. Es fácil y claro, y puedes tener tantas columnas como quieras.
Ejemplo:
$ var=$(echo -e 'kris hansen oslo\nthomas jonson peru\nbibi abu johnsonville\njohnny lipp peru')
$ echo "$var"
kris hansen oslo
thomas johnson peru
bibi abu johnsonville
johnny lipp peru
Si usted quiere encontrar todos en Perú
$ echo "$var" | grep peru
thomas johnson peru
johnny lipp peru
Sólo grep (SED) en el tercer campo
$ echo "$var" | sed -n -E '/(.+) (.+) peru/p'
thomas johnson peru
johnny lipp peru
Si sólo desea campo x
$ echo "$var" | awk '{print $2}'
hansen
johnson
abu
johnny
Todos en Perú que se llama Thomas y simplemente volver a su apellido
$ echo "$var" |grep peru|grep thomas|awk '{print $2}'
johnson
Cualquier consulta que se pueda imaginar ... SuperEasy.
Para cambiar un artículo:
$ var=$(echo "$var"|sed "s/thomas/pete/")
Para eliminar una fila que contiene "x"
$ var=$(echo "$var"|sed "/thomas/d")
Para cambiar otro campo en la misma fila en base a un valor de otro elemento
$ var=$(echo "$var"|sed -E "s/(thomas) (.+) (.+)/\1 test \3/")
$ echo "$var"
kris hansen oslo
thomas test peru
bibi abu johnsonville
johnny lipp peru
Por supuesto, el bucle también funciona si desea hacer eso
$ for i in "$var"; do echo "$i"; done
kris hansen oslo
thomas jonson peru
bibi abu johnsonville
johnny lipp peru
El Gotcha única Iv'e encontrado con esto es que necesidad hay que proporcionar los var (en el ejemplo; y ambas var i) o las cosas van a tener este aspecto
$ for i in "$var"; do echo $i; done
kris hansen oslo thomas jonson peru bibi abu johnsonville johnny lipp peru
y alguien, sin duda, van a decir que no funcionará si tiene espacios en su entrada, sin embargo, que se puede fijar utilizando otro delimitador en su entrada, por ejemplo, (utilizando un carbón utf8 ahora hacer hincapié en que se puede elegir algo que su entrada no contendrá, pero se puede elegir cualquier OFC):
$ var=$(echo -e 'field one☥field two hello☥field three yes moin\nfield 1☥field 2☥field 3 dsdds aq')
$ for i in "$var"; do echo "$i"; done
field one☥field two hello☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
$ echo "$var" | awk -F '☥' '{print $3}'
field three yes moin
field 3 dsdds aq
$ var=$(echo "$var"|sed -E "s/(field one)☥(.+)☥(.+)/\1☥test☥\3/")
$ echo "$var"
field one☥test☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
Si desea almacenar nuevas líneas en su entrada, se podría convertir el salto de línea a algo más antes de la entrada y convertirlo nuevamente en la salida (o no usar bash ...). ¡Disfrutar!
Relacionado: [Cómo declarar una matriz 2D en bash] (http://stackoverflow.com/q/16487258/55075) – kenorb