После большого количества проб и ошибок я нахожу самый лучший, самый чистый и простой многомерный массив в bash, чтобы использовать обычный var. Ага.
Преимущества: вам не нужно проходить через большой массив, вы можете просто эхо «$ var» и использовать grep/awk/sed. Это легко и понятно, и вы можете иметь столько столбцов, сколько хотите.
Пример:
$ 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
Если вы хотите, чтобы найти все перу
$ echo "$var" | grep peru
thomas johnson peru
johnny lipp peru
Только Grep (СЭД) в третьем поле
$ echo "$var" | sed -n -E '/(.+) (.+) peru/p'
thomas johnson peru
johnny lipp peru
Если вы хотите только й поле
$ echo "$var" | awk '{print $2}'
hansen
johnson
abu
johnny
Все в перу, что называется ТОМАС и просто вернуть его ЬавЬЫате
$ echo "$var" |grep peru|grep thomas|awk '{print $2}'
johnson
Любой вопрос вы можете думать ... SuperEasy.
Чтобы изменить позицию:
$ var=$(echo "$var"|sed "s/thomas/pete/")
Чтобы удалить строку, которая содержит «х»
$ var=$(echo "$var"|sed "/thomas/d")
Для изменения другого поля в той же строке на основе значения из другого пункта
$ var=$(echo "$var"|sed -E "s/(thomas) (.+) (.+)/\1 test \3/")
$ echo "$var"
kris hansen oslo
thomas test peru
bibi abu johnsonville
johnny lipp peru
Конечно, петлевые работы тоже, если вы хотите это сделать
$ for i in "$var"; do echo "$i"; done
kris hansen oslo
thomas jonson peru
bibi abu johnsonville
johnny lipp peru
Единственный глюк iv'e нашел с этим, что вы обязательно всегда процитировать вар (в примере; как вар и я) или вещи будут выглядеть следующим образом
$ for i in "$var"; do echo $i; done
kris hansen oslo thomas jonson peru bibi abu johnsonville johnny lipp peru
и кто-то, несомненно, будет сказать, что это не будет работать, если у вас есть пробелы в вашем входе, однако, что может быть исправлено с помощью другой разделители в вашем входе, например, (с использованием utf8 полукокса Теперь, чтобы подчеркнуть, что вы можете выбрать что-то ваш вход не будет содержать, но вы можете выбрать любой 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
Если вы хотите сохранить переводы строк в вашем входе, можно преобразовать строку к чему-то еще до ввода и конвертировать его обратно на выходе (или не использовать bash ...). Наслаждайтесь!
Связано: [Как объявить 2D-массив в bash] (http://stackoverflow.com/q/16487258/55075) – kenorb