Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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,

serged #7 a écrit :

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.

serged #7 a écrit :

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