Code:
alias blah1234 {
  ; $1 = number to delete, all higher numbers move down one
  ;
  if ($hfind(hashtablename,global.text. $+ $1 $+ .*,1,w)) {
    hdel hashtablename $ifmatch
    var %i = $1 | inc %i
    while ($hfind(hashtablename,global.text. $+ %i $+ .*,1,w)) {
      var -s %old.item = $ifmatch
      var -s %old.item.value = $hget(hashtablename,%old.item)
      hadd -s hashtablename $puttok(%old.item, $calc(%i - 1) , 3,46) %old.item.value
      hdel -s hashtablename %old.item
      inc %i
    }
  }
}


Assuptions I have made are, that there is only ever one item named global.text.N.* (N being a number), and that the numbering well not have gaps.