• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

sortierung (buchstaben nach zahlen)

Snubnose

Hacker
Hallo,
ich würde gerne eine Textdatei sortieren
also
cat datei | sort
allerdings sollten Zahlen nach Buchstaben kommen.
d.h.

a...
b...
c...
z...
0...
1...
4...

Das muss irgendwie über die LC_COLLATE
gehen, jemand ne idee ?
 
( cat datei | grep -v ^[0-9] | sort ; cat datei | grep ^[0-9] | sort -n ) > resultat

LC_* nutze ich nicht. Aber wie ist es mit dem Befehl oben ?

Haveaniceday
 

TeXpert

Guru
haveaniceday schrieb:
LC_* nutze ich nicht. Aber wie ist es mit dem Befehl oben ?

natürlich, wenn auch implizit....

@subnose... entweder schauen, ob Du eine passende Locale-Einstellung findest, die dann entsprechend setzen oder sich eine eigene bauen
Code:
man 5 locate
hilft für den Anfang
 
TeXpert schrieb:
Code:
man 5 locate

Oder meinst du "man 5 locale"
Dort ist der Verweis auf die "beste aktuelle Doku":
For more details see the sources in /usr/lib/nls/src notably the examples POSIX, Example and Example2

Passt immer *grins*

Haveaniceday
 
OP
S

Snubnose

Hacker
@haveaniceday:
gute Idee, leider mein Problem komplexer: ich muss meine Datenbank nämlich umstellen wegen der Sortierung (postgresql), das geht meines wissens nach nur über LC_COLLATE

@all:
die Manpage ist ja schön und gut, aber ich habe kein /usr/lib/nls/src und wüsste auch nicht mit welchem Paket ich das nachinstallieren könnte....

ich hab leider bisher kein gescheites Beispiel gefunden über eine COLLATE-File... Sonst würde ich mir ja eins bauen...
 
http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/files/aixfiles/LC_COLLATE.htm

dann würde ich auch man "locale" und "localedef" empfehlen.
Dann kannst du noch die Sourcen von glibcund glibc-locale installieren. Da dürften Beispiele drin sein.
gute Idee, leider mein Problem komplexer: ich muss meine Datenbank nämlich umstellen wegen der Sortierung (postgresql), das geht meines wissens nach nur über LC_COLLATE

Verstehe ich nicht. Was muss man den für die Datenbank machen ?
Willst du die Abfrage/Antwort von der Datenbank ensprechend sortieren lassen ?

Haveaniceday

PS: Wenn ich suche wie / woher war kommt nutze ich folgendes:
rpm -q --whatprovides `which locale`
Paket gefunden...
rpm -q -l glibc
Paket Inhalt
Mit strace lässt sich rausfinden, wodrauf ein Programm alles zugreift.
export LC_COLLATE=de ; echo Hallo | strace -e trace=file sort 2>&1 1>/dev/null | grep -v ENOENT
ohne "grep" ond ohne "2>&1" 1>/dev/null ist das unübersichtlicher.
und jetzt noch ein paar rpm -q --whatprovides und du findest alles.
 
OP
S

Snubnose

Hacker
also ich habe in endeffekt ein Datenbankquery dass dann mit ORDER BY so sortiert ausgeben soll, dass Zahlen nach den Buchstaben kommen

(p.s.: ich bin von deinem strace beeindruckt)
 
postgresql sort "order by" LC_COLLATE

Unter google wird gesagt, dass die Datenbank nur ein LC_COLLATE zu initdb time ( was immer das heisst ) kann.
Das würde dann heissen du stellst das Sort für alles um. Hmm ob das gut ist ?
Ich würde eher herumprogrammieren. Einfach zwei Abfragen mit einmal "ohne Zahl"
und dann den Rest also nur die Zahlen.

Haveaniceday

PS: strace ist geil. Heisst auf manchen UNIX-Systemen auch truss. Hat mir schon manchmal die Suche nach Konfigurationen und Libraries einfacher gemacht.
Zusammen mit "lsof" und "ldd <binary>" kriegt man einiges von den Interna mit.
 
Auf meinem 10.0 gibt es:
/usr/share/i18n/charmaps/*.gz

Ist das so etwas, was du suchst ?

Haveaniceday

PS: EBCDIC-AT-DE-A.gz Scheint die Zalhen am Ende zu haben...
Also einfach auf EBCDIC umstellen (?????????)
 

regexer

Advanced Hacker
Zum Thema LC_COLLATE habe ich noch eine etwas ältere aber interessante Diskussion zu bieten:

http://www.linux-club.de/viewtopic.php?t=29854
 
OP
S

Snubnose

Hacker
als root:
glibc-i18n....rpm draufgezogen per yast

dann die POSIX - locale nach POSTGRES kopiert

in der POSTGRES unter LC_COLLATE die Sortierreihenfolge geändert

binärefile erstellen: localedif -c -i POSTGRES POSTGRES

rcpostgresql stop

als postgres:
Datenbank sichern
pgdump .....

Datenbank löschen
rm /var/lib/pgsql/* -R

Datenbank mit neuem Locale anlegen
initdb --lc-collate=POSTGRES

Daten wieder einspielen
psql ....
 
Oben