[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Sortieren von Zeilen mit Zahlen



Michelle Konzack schrieb:
> 
> Es gibt ja verschiedene Tools wie "sort", "sed" und weitere mit denen
> man sortieren kann, nur kein einziges sortiert so, wich ICH es will.  :-/
>  
> und will es den ZAHLENWERTEN nach sortieren.  Der einzige HACK der mir
> einfällt, ist festzustellen, wie lang die LÄNGSTE Zeile ist, dann mit
> printf() Nullen vor alle andere machen damit alle die gleiche Länge
> haben, dann sortieren um danach die führnden Nullen wieder zu entfernen.
> 
> Hat jemand eine bessere Idee als so ein schwachfug?
> 
Ich weiss nicht mehr wo das herkommt, finde es auch nicht mehr in google,
aber ich hab hier ein kleines C-Programm sort_numeric rumliegen, das 
sortiert vermutlich so wie Du es willst, sprich 10 kommt nach 9 (oder 
09 oder 0009,...) und nicht nach 1.
Ich haeng es mal ran, wenn das nicht durchkommt gerne per mail.

Und wech,
Manne
/*
  when you have files like this :

  foo1.jpg
  foo5.jpg
  foo9.jpg
  foo10.jpg
  foo11.jpg

  then "sort -n" doesnt cut the mustard.
  This simple C program does it the right way.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_LINE_LENGTH 32768

int comparitor(const void *A, const void *B)
{
  char *sa=*(char **)A ;
  char *sb=*(char **)B ;
  int sal=strlen(sa) ;
  int sbl=strlen(sb) ;
  int ix, na=0, nb=0 ;
  int amode=0, bmode=0 ;

  fprintf(stderr,"compare [%s] to [%s]\n",sa,sb) ;

  for(ix=0;(ix<sal)&&(ix<sbl);ix++)
    {
      if(isdigit(sa[ix]))
        {
          if(amode<2)
            {
              amode=1 ;
              na*=10 ;
              na+=(unsigned int) (sa[ix]-'0') ;
            }
        }
      else
        {
          if(amode==1)
            amode=2 ;
        }
      if(isdigit(sb[ix]))
        {
          if(bmode<2)
            {
              bmode=1 ;
              nb*=10 ;
              nb+=(unsigned int) (sb[ix]-'0') ;
            }
        }
      else
        {
          if(bmode==1)
            bmode=2 ;
        }
      if((amode>1)&&(bmode>1))
        {
          if(na>nb)
            return(1) ;
          if(nb>na)
            return(-1) ;
          amode=0 ;
          bmode=0 ;
        }
      if((amode==0)||(bmode==0))
        {
          if(((unsigned int) sa[ix]) > ((unsigned int) sb[ix]))
            return(1) ;
          if(((unsigned int) sb[ix]) > ((unsigned int) sa[ix]))
            return(-1) ;
        }
    }
  if(ix<sal)
    return(1) ;
  if(ix<sbl)
    return(-1) ;

  return(0) ;
}

int main()
{
  char *temps ;
  char *elem ;
  char **array=NULL ;
  int length=0, size=0 ;
  temps=malloc(MAX_LINE_LENGTH) ;
  int ix ;

  for(;fgets(temps,MAX_LINE_LENGTH,stdin);)
    {
      elem=strdup(temps) ;
      if(length==size)
        {
          size=(128+size)*2 ;
          array=realloc(array,size*sizeof(char *)) ;
        }
      array[length++]=elem ;
    }

  qsort(array,length,sizeof(char *),comparitor) ;

  for(ix=0;ix<length;ix++)
    {
      printf("%s",array[ix]) ;
      free(array[ix]) ;
    }
  if(array)
    free(array) ;
}

Reply to: