2015-04-24 3 views
1

Как отсортировать ассоциативный массив в bash?Как сортировать ассоциативный массив bash-скрипт

Например, у меня есть массив в Баш:

[0,0]="Max" 
[0,1]="25" 
[1,0]="Vladimir" 
[1,1]="0" 
[2,0]="Mayki" 
[2,1]="50" 

Выход должен быть:

  1. Mayki - 50
  2. Max - 25
  3. Владимир - 0

Я не знаю, как сортировать этот массив.

Дополнительная информация: я анализирую ассоциативный массив из текстового файла («log.txt»)

#!/bin/bash 

declare -A b_array 

# Read the file in parameter and fill the array named "array" 
getArray() { 

    i=0 
    w=9 

    count=10 

    while read line # Read a line 
    do 
     k=0 
     #array[i]=$line # Put it into the array 

     #b_array[$i,0]=$(grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" <<<"$line") 

     for word in $line; 
      do 
        #echo $k; 
        #echo $word; 
        if [ "$k" = "$w" ]; then 
         if [ $word != "-" ]; then 
         b_array[$i]=$word 
         i=$(($i + 1)) 
         fi 

        fi 
        k=$(($k + 1)) 
      done 


    done < $1 
} 

getArray "log.txt" 
+1

Вы лучше использовать язык с лучшей поддержкой структуры данных. – chepner

+1

Как выглядит вход? Что этот массив примеров имеет отношение к чему-либо? Вы не создаете такого типа (bash не может этого сделать). Кажется, у вас нет никого подобного на входе (хотя это совсем не ясно). Ассоциативные массивы не имеют порядка, поэтому лучше всего вы можете выбрать и отсортировать ключи, а затем перебрать этот отсортированный список ключей. –

+0

Это моя домашняя работа Университета KPI –

ответ

1

Есть пара подхода к этой проблеме. Один из самых простых, вероятно, читать пары строк в индексный массив, а затем обратный числовой вид на поле номер:

#!/bin/bash 

declare -A arr 
declare -a sa 

arr[0,0]="Max" 
arr[0,1]="25" 
arr[1,0]="Vladimir" 
arr[1,1]="0" 
arr[2,0]="Mayki" 
arr[2,1]="50" 

## convert associative array to 
# indexed array of string pairs 
# (e.g. "Max - 25", "Mayki - 50") 
for i in ${!arr[@]}; do       # for each key in ar 

    x=${i%,*}         # separate x,y values 
    y=${i#*,} 
    ((y == 1)) && continue     # if y == 1, continue 

    for j in ${!arr[@]}; do      # for each key in ar 

     _x=${j%,*}        # separate _x,_y values 
     _y=${j#*,} 
     ((x != _x)) || ((_y == 0)) && continue # if x != _x, or _y == 0, continue 

     sa+=("${arr[$i]} - ${arr[$j]}")  # add combined string to indexed sa 

    done 
done 

sort -r -k3 -n <<<"$(printf "%s\n" "${sa[@]}")" # numeric reverse sort sa on key3 

exit 0 

Выходной

$ bash sort_assoc.sh 
Mayki - 50 
Max - 25 
Vladimir - 0 
+0

-bash-4.1 $ Есть ошибки :( –

+0

Какие ошибки? 'GNU bash, версия 4.3.33' Существуют и другие способы сортировки индексированного массива, если это дает вам проблемы. Я проверил, также работает на' GNU bash, версия 4.2.37' (самый старый у меня есть) –

+0

: Нет такого файла или directoryh : команда не найдена «: не является допустимым идентификатором' ар »: не является допустимым идентификатором' са : команда не найдена : команда не найдена sort.sh: линия 36: ошибка синтаксиса: неожиданный конец файла -bash-4.1 $ –

0

я бы, вероятно, переключиться на Perl для такой сложной задачи, даже если это все-таки выполнимо в Баш:

#!/bin/bash 

declare -A arr 
arr=([0,0]="Max" 
    [0,1]="25" 
    [1,0]="Vladimir" 
    [1,1]="0" 
    [2,0]="Mayki" 
    [2,1]="50" 
    [10,0]=Ivan 
    [10,1]=10 
    ) 

indices=($((IFS=$'\n' ; echo "${!arr[*]}") | grep ,0 | cut -d, -f1 | sort)) 

for i in "${indices[@]}" ; do 
    echo ${arr[$i,0]} ${arr[$i,1]} 
done | sort -rnk2 

было бы намного проще, если бы вы определили массив как

arr=([Max]=25 
    [Vladimir]=0 
    [Mayki]=50 
    [Ivan]=10 
    ) 

for paren in "${!arr[@]}" ; do 
    echo $paren ${arr[$paren]} 
done | sort -rnk2 
+0

У меня есть ошибка: : команда не найдена ': недействительный идентификатор: 'arr : команда не найдена : команда не найдена 'est3.sh: строка 16: синтаксическая ошибка около неожиданного токена 'do ' est3.sh: строка 16:' for i in "$ {index [@]}"; do –

+0

@ МаксимБорисов: Какая версия bash? – choroba

+0

Bash версия 4.1 –

Смежные вопросы