基于变量和第n个字符解析数组

时间:2017-02-20 21:57:34

标签: arrays bash

希望能够根据变量解析数组并接下来的2个字符

array=( 7501 7302 8403 9904 )
  

如果var = 73,则所需结果为02
  如果var = 75,则所需结果为01
  如果var = 84,则所需结果为03
  如果var = 99,则期望的结果是04

很抱歉,如果这是一个基本问题,但我尝试过cut和grep的变体,但找不到解决方案。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用printfawk

来使用此搜索功能
srch() {
    printf "%s\n" "${array[@]}" | awk -v s="$1" 'substr($1, 1, 2) == s{
    print substr($1, 3)}' ;
}

然后将其用作:

srch 75
01

srch 73
02

srch 84
03

srch 99
04

答案 1 :(得分:2)

由于bash数组很稀疏,即使在旧版本的bash中没有关联数组(将任意字符串映射为键),你也可以拥有一个常规数组,它只包含你希望映射的数字索引的键。考虑以下代码,它接受您的输入数组并生成该表单的输出数组:

array=( 7501 7302 8403 9904 )

replacements=( )                    # create an empty array to map source to dest
for arg in "${array[@]}"; do        # for each entry in our array...
  replacements[${arg:0:2}]=${arg:2} # map the first two characters to the remainder.
done

这将创建一个看起来像的数组(如果您在上面的代码之后运行declare -p replacements来转储replacements变量的描述:

# "declare -p replacements" will then print this description of the new array generated...
# ...by the code given above:
declare -a replacements='([73]="02" [75]="01" [84]="03" [99]="04")'

然后,您可以轻松查找其中的任何条目,作为不需要外部命令的常量操作:

$ echo "${replacements[73]}"
02

...或独立遍历键和相关值:

for key in "${!replacements[@]}"; do
  value=${replacements[$key]}
  echo "Key $key has value $value"
done

...将发出:

Key 73 has value 02
Key 75 has value 01
Key 84 has value 03
Key 99 has value 04

注释/参考文献: