Сопоставить ключ ассоциативного массива со строкой или IP-адресом

С GNU awk:

awk '{$1=$1}1' FIELDWIDTHS='1 2 2 4 1' OFS=',' file

Или с GNU sed:

sed -r 's/^(.{1})(.{2})(.{2})(.{4})(.{1})$/\1,\2,\3,\4,\5/' file 

Выход:

1,23,45,6789,0
9,87,65,4321,0

См.:8 Мощный Awk, встроенный -в переменных — FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

0
28.10.2021, 19:49
1 ответ

iв цикле for — это индекс элементов массива:

${!name[@]}
${!name[*]}

If name is an array variable, expands to the list of array indices (keys) assigned in name. If name is not an array, expands to 0 if name is set and null otherwise. When ‘@’ is used and the expansion appears within double quotes, each key expands to a separate word.

В вашем случае:

[156.119.57.30]="156.119.57.31"

Вместо этого вы сравниваете значение , вы можете лучше видеть, печатая переменные

$ for i in "${!assArray1[@]}"; do
    echo "${assArray1[$i]}"
  done
156.119.57.11
156.119.57.31
156.119.57.22

Итак, чтобы сравнить ключи:

$ for i in "${!assArray1[@]}"; do
    if [[ "$i" = "$IPADDR" ]]; then
      keys+=( "$i" )
    fi
  done
$ echo "${keys[@]}"
156.119.57.10
0
28.10.2021, 20:34

Теги

Похожие вопросы