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: