Если файл создается один раз, а затем на него ссылаются снова и снова, без изменения между ними, вам нужно использовать ассоциативный массив в качестве таблицы поиска. Это может стать большим и безобразным в bash; вместо этого рассмотрим perl.
Однако вы спросили, как это сделать в bash.
$: eval "declare -A lookup=(
$( sed -E 's/^([^,]+),([^,]+).*/ [\1]=\2/' filename )
)"
Теперь все значения должны быть в таблице lookup
.
Ассоциативный массив использует строки в качестве ключей вместо целых чисел, поэтому он устанавливает ключи и значения в виде пар в таблице.
sed -E 's/^([^,]+),([^,]+).*/ [\1]=\2/'
берет первое и второе поля файла с разделителями-запятыми и переформатирует их в присваивания ключ / значение в синтаксисе bash, например:
declare -A lookup=(
[a]=1
[b]=2
[c]=3 # ... and so on
)
eval
разбирает все это в текущей среде для вашего использования.
Не более grep
х. Просто используйте "${lookup[$myvar]}"
.
Если вы просто хотели назначить его для удобства чтения, тогда вместо grep
используйте
myvalue="${lookup[$myvar]}"
Мой локальный пример использования:
$: cat x
a,1,lijhgf
b,2,;lsaoidj
c,3,;l'skd
$: echo "declare -A lookup=(
$( sed -E 's/^([^,]+),([^,]+).*/ [\1]=\2/' x )
)"
declare -A lookup=(
[a]=1
[b]=2
[c]=3
)
$: eval "declare -A lookup=(
$( sed -E 's/^([^,]+),([^,]+),.*/ [\1]=\2/' x )
)"
$: echo "${lookup[b]}"
2