sort by column

Tony Balinski ajbj at free.fr
Wed Nov 15 18:46:21 CET 2006


Quoting wayne.lydecker at l-3com.com:

> Nedit has a neat feature that allow me to sort a column.  What
> I'd like to be able to do is sort BY column.  That is, highlight
> a column (e.g. numbers) and have the lines sorted based on the
> values in the column.  It's amazing how often I need a feature
> like that.  Is there a macro that does this?

If you want to use string sort, here's a cheap-n-nasty way to do it
without invoking the sort command:

Sort lines by column:

sel_start = $selection_start
sel_end   = $selection_end
sel_left  = $selection_left
sel_right = $selection_right

sel_ok = (sel_start > 0)

# no selection? take whole file
if (sel_start < 0)
  {
  sel_start = 0
  sel_end   = $text_length
  }

# lines to sort
lines = get_range(sel_start, sel_end)

# keys to sort by
if (sel_left >= 0)
  keys = get_selection() # use rectangular selection content
else
  keys = lines

keysA  = split(keys, "\n")
linesA = split(lines, "\n")

sorted = $empty_array
rep_ct = $empty_array
pad = replace_in_string(keysA[], ".", " ", "regex")
padlen = length(pad)

# construct unique key for each line by adding a repeat count, then adding
# the line to the sorted[] array using this key
# (the repeat count is right justified to preserve original input order
# among repeat occurrences of the key)
for (i = 0; i in keysA; ++i)
  {
  key = keysA[i]
  if (!(key in rep_ct))
    count = 0
  else
    count = rep_ct[key]
  ++count
  rep_ct[key] = count
  scount = pad count
  len = length(scount)
  scount = substring(scount, len - padlen, len)
  sorted[key "\n" scount] = linesA[i]
  }

# read out the sorted array into lines
lines = ""
sep = ""
for (key in sorted)
  {
  lines = lines sep sorted[key]
  sep = "\n"
  }

# put it back in the document
replace_range(sel_start, sel_end, lines)
# put back selection
if (sel_ok)
  {
  if (sel_left < 0)
    select(sel_start, sel_end)
  else
    select_rectangle(sel_start, sel_end, sel_left, sel_right)
  }


More information about the Discuss mailing list