#1 Le 20/06/2012, à 16:20
- m_m
[Résolu] Commande sort et caractères non-alphanumériques
Bonjour!
Voici une discussion que je viens d'avoir avec mon terminal:
~/tmp$ cat fichier.txt
a
(h)
j
k
(e)
f
g
c
d
b
i
~/tmp$ sort fichier.txt
a
b
c
d
(e)
f
g
(h)
i
j
k
~/tmp$ sort -d fichier.txt
a
b
c
d
(e)
f
g
(h)
i
j
k
Donc, sort et sort -d donnent le même résultat, c'est à dire les lignes du fichier triées, en ignorant les caractères non-alphanumériques. Mais moi, j'aurais voulu ça (les lignes avec parenthèses peuvent être au début ou à la fin, ça m'est égal)
(e)
(h)
a
b
c
d
f
h
i
j
k
D'après ce que j'ai compris du manuel, sort ne devraient pas ignorer les parenthèses, sauf si l'option -d est présente.
Est-ce qu'il y a une option que j'ai ratée? Est-ce un bug de sort (ce qui serait plutôt surprenant...)?
Merci pour votre aide!
Dernière modification par m_m (Le 20/06/2012, à 18:52)
Hors ligne
#2 Le 20/06/2012, à 16:38
- serged
Re : [Résolu] Commande sort et caractères non-alphanumériques
Un petit :
export LC_ALL=C
avant... (et pas d'option -d).
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#3 Le 20/06/2012, à 18:54
- m_m
Re : [Résolu] Commande sort et caractères non-alphanumériques
Merci! Ça fonctionne (même si je ne comprends pas exactement pourquoi...)
Hors ligne
#4 Le 21/06/2012, à 03:44
- nesthib
Re : [Résolu] Commande sort et caractères non-alphanumériques
L'ordre des lettres dépend de la langue (de la locale) et est donc différent en fonction de ce qui est défini sur ton système.
pour voir ta configuration :
locale
pour voir les locales disponibles :
locale -a
NB. si tu ne veux définir la locale que pour une commande unique :
LC_ALL=C sort …
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 22/06/2012, à 14:12
- m_m
Re : [Résolu] Commande sort et caractères non-alphanumériques
OK.
Ma question suivante est donc: est-il possible de faire un sort qui:
- n'ignore pas les caractères non-alphanumériques
- respecte l'ordre francophone
Donc qui trierait la liste ci-dessous de la manière suivante:
(a)
(b)
(c)
a
à
e
d
z
(avec LC_ALL=C sort fichier.txt, le "à" se retrouve tout à la fin...)
Hors ligne
#6 Le 22/06/2012, à 18:51
- pingouinux
Re : [Résolu] Commande sort et caractères non-alphanumériques
Salut,
J'ai une solution en python3 (j'ai aussi mis la version python2, un peu plus compliquée) :
La version en python3 :
$ cat tri_alpha3.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import sys
def key(lig) :
ret=''
for k in lig :
kl=k.lower()
if kl in 'aàâ' : ret+='a'
elif kl in 'eéèêë' : ret+='e'
elif kl in 'iîï' : ret+='i'
elif kl in 'oô' : ret+='o'
elif kl in 'uùû' : ret+='u'
elif kl in 'cç' : ret+='c'
else : ret+=kl
return ret
txt=sys.stdin.read().split("\n")
txt.sort(key=key)
for lig in txt : sys.stdout.write( "%s\n"%lig )
La version en python2 :
$ cat tri_alpha2.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
import sys
def key(lig) :
ret=''
for k in lig :
kl=k.lower()
if kl in u'aàâ' : ret+='a'
elif kl in u'eéèêë' : ret+='e'
elif kl in u'iîï' : ret+='i'
elif kl in u'oô' : ret+='o'
elif kl in u'uùû' : ret+='u'
elif kl in u'cç' : ret+='c'
else : ret+=kl
return ret
txt=sys.stdin.read()
txt=unicode(txt,'utf-8').split("\n")
txt.sort(key=key)
for lig in txt : print( "%s"%(lig.encode('utf-8')) )
Le fichier de départ, non trié :
$ cat fichier
É
a
(h)
j
k
(e)
f
g
gébb
géab
gÉab
gÉàb
gÉçb
gÉb
g
à
c
é
d
b
e
B
Le fichier trié :
$ ./tri_alpha3.py <fichier
(e)
(h)
a
à
b
B
c
d
É
é
e
f
g
g
géab
gÉab
gÉàb
gÉb
gébb
gÉçb
j
k
Hors ligne
#7 Le 23/06/2012, à 08:05
- serged
Re : [Résolu] Commande sort et caractères non-alphanumériques
Ton tri ne va marcher que pour le français(¹) (et encore t'as oublié le Ÿ(²)) et de plus ne triera pas les accents entre eux (différencier "élève", élevé"(³)...).
(¹) : En espagnol, par exemple, les caractères accentués (ñ par exemple) et certains groupes de caractères (ch, ll) sont considérés comme des lettres à part entière.
(²) : Pierre Louÿs et l'Haÿ-les-Roses
(³) : "élevé" passe derrière "élève"
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#8 Le 23/06/2012, à 08:49
- pingouinux
Re : [Résolu] Commande sort et caractères non-alphanumériques
Bonjour,
Ton tri ne va marcher que pour le français(¹) (et encore t'as oublié le Ÿ(²))
Je sais que la liste est incomplète, mais il est facile de rajouter ce qui manque.
et de plus ne triera pas les accents entre eux (différencier "élève", élevé"(³)
(³) : "élevé" passe derrière "élève"
En fait, il conserve l'ordre de départ, car il ne fait pas de distinction entre e, é, è, É…
En remplaçant cette séquence :
def key(lig) :
ret=''
for k in lig :
kl=k.lower()
if kl in 'aàâ' : ret+='a'
elif kl in 'eéèêë' : ret+='e'
elif kl in 'iîï' : ret+='i'
elif kl in 'oô' : ret+='o'
elif kl in 'uùû' : ret+='u'
elif kl in 'cç' : ret+='c'
else : ret+=kl
return ret
par celle-ci (ajout de ret+=k) :
def key(lig) :
ret=''
for k in lig :
kl=k.lower()
if kl in 'aàâ' : ret+='a'
elif kl in 'eéèêë' : ret+='e'
elif kl in 'iîï' : ret+='i'
elif kl in 'oô' : ret+='o'
elif kl in 'uùû' : ret+='u'
elif kl in 'cç' : ret+='c'
else : ret+=kl
ret+=k
return ret
les lettres équivalentes sont triées aussi.
Hors ligne