bash : extraction de caractères

bash : extraction de caractères - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 16-02-2009 à 11:49:11    

Hello,
 
J'ai une liste de noms composés dont j'aimerais extraire les 1er caractères en bash.
 
Exemple : "marie-chantal" donne "mc", "jean-daniel" donne "jd".
 
J'ai bien trouvé une solution en utilisant 3 'cut' consécutifs, mais je me demande s'il existe plus élégant !! :)


---------------
D3/Hots/Hs Doc#2847
Reply

Marsh Posté le 16-02-2009 à 11:49:11   

Reply

Marsh Posté le 16-02-2009 à 11:59:32    

sed -n -e 's/^\(.\).*\-\(.\).*$/\1\2/p'


Reply

Marsh Posté le 16-02-2009 à 12:03:55    

gratz :)


---------------
D3/Hots/Hs Doc#2847
Reply

Marsh Posté le 16-02-2009 à 20:20:01    

Faut pas non plus batailler. Je vois trop de gens chier des usines à gaz en shell (plusieurs milliers de lignes), avec du awk à toutes les sauces, des fichiers temporaires (pas temporaires du tout), des tas de merdes pas réutilisables (me parler pas des fonctions shell ça dépend toujours de 14 variables externes, etc).
 
Des que ça s'allonge, ça devient très vite intéressant de faire genre du perl, d'avoir des structures de données, des vrais fonctions réutilisables, un découplage des formats d'entrée et de sortie. Pour un volume de code très inférieur.
 
Même quand on est coincé sur un perl 5.6, ça sera toujours meilleur. Ne serait-ce qu'en gestion d'erreur, etc. La plus part des scripts shell rendent l'ame avec un pauvre "set -e -u", le fait qu'ils fonctionnent tient plus de la chance que d'autres choses.
 
J'ai rien contre le shell, mais dès qu'il y a un vrai traitement, de transformation, etc, ce n'est plus adapaté, sauf pour empoisonner les gens qui viendront après vous et perdre du temps.

Reply

Marsh Posté le 17-02-2009 à 15:00:06    

Il faut que je me mette au perle plus serieusement alors :)
 
Je me pose certaine question sur la vitesse des scripts bash. Dans l'exemple ci dessous, le script marche mais est extremement lent ! Sur un machine puissante, il crée seulement une ligne toute les 3-5 secondes sur le fichier de sortie !!! Je ne sais pas d'ou cela vient  :??: !!
 

Code :
  1. FILE_TMP=/home/xx.txt
  2. FILE_PROF=/home/xxx.txt
  3. DATE=`date +%Y%m%d`
  4. while read ligne; do
  5.         #creation du login
  6.         nom=$(echo $ligne | cut -d '|' -f1 | cut -d '-' -f1)
  7.         prenom=$(echo $ligne | cut -d '|' -f2)
  8.         login=$(echo ${prenom:0:2})$nom
  9.         grep $login $FILE_PROF > /dev/null 2>&1
  10.          #si occurence non trouvee on inscrit le compte dans le fichier sortie
  11.         if [ $? -eq 1 ]; then
  12.          #creation dun mdp aleatoire
  13.          PASSWORD=`/usr/bin/makepasswd --chars=6`
  14.          #out
  15.          echo $ligne | sed -e "s/$/|$login|$PASSWORD|$DATE/" >> $FILE_PROF
  16.         fi
  17. done < $FILE_TMP


Message édité par hfrfc le 17-02-2009 à 15:01:33

---------------
D3/Hots/Hs Doc#2847
Reply

Marsh Posté le 17-02-2009 à 15:43:29    

Ben il faut tracer avec l'option "-x", si c'est si lent que cela, l'endroit va sauter aux yeux ...

Reply

Marsh Posté le 17-02-2009 à 15:48:52    

ben je dirais bien que ça dépend de la taille de ton fichier FILE_PROF surtout :spamafote:
tu fais un grep dessus, si le fichier est énorme, ça prend bien du temps quoi :/


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 17-02-2009 à 15:51:33    

350 ligne ca va encore  [:spamafote]


---------------
D3/Hots/Hs Doc#2847
Reply

Marsh Posté le 17-02-2009 à 15:54:29    

longueur de la ligne ? :??:
j'vois qu'ça [:cosmoschtroumpf]
 
ou sinon, machine bien chargée et nice de merde sur ton script :spamafote:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 17-02-2009 à 16:58:48    

70-80 de longueur :/
 
pas de charge sur la machine :/
 
Bref bizarre. Ca fait le meme comportement sur une VM linux et sur le serveur reel (etch).


---------------
D3/Hots/Hs Doc#2847
Reply

Marsh Posté le 17-02-2009 à 16:58:48   

Reply

Marsh Posté le 19-02-2009 à 01:57:20    

Salut,
 
si tu veut du concis :
 

Code :
  1. #!/usr/bin/env bash
  2. # vim:ts=4:sw=4
  3. for arg; do
  4.     tg=${arg%-*} td=${arg#*-}
  5.     [[ $td != $tg ]] && printf '%s\n' ${tg:0:1}${td:0:1} || true
  6. done


 
 
Je n'utilise ques des builtins bash.
En testant dans vim :

Code :
  1. :!bash % charles-henry pierre marc-andre robespierre


J'obtient :
ch
ma


Message édité par sputnick le 19-02-2009 à 02:00:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed