Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Bah, dans l'exemple donné, il s'agit de nombres à 3 décimales max : yaka commencer par tous les multiplier par 1000 et hop !, un pb de moins.
Et peut-être que ça incitera Dorhub à donner le lien (déjà demandé) vers le post où il a trouvé sa solution, celle ayant été postée ici étant incomplète...
même pas.ça sent furieusement le type qui a tenté de le faire en bash et qui n'y est pas arrivé
pourtant disedorgue nous a montré comment faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 cmp_dec(){ local yy printf -v yy '10#%.3f%s10#%.3f' $2 - $1 yy=${yy//10#-/-10#} printf -v res %.0f\\n "$((10**9 * (${yy//,/})))e-9" [[ "$res" -eq "0" ]] && echo $res || echo ${res//[0-9]*/1} }Testé très rapidement...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $ cmp_dec 5,215 5,215 0 $ cmp_dec 5,215 -5,215 -1 $ cmp_dec -5,215 5,215 1 $ cmp_dec -5,215 -5,215 0
ou en plus traditionnel (algo)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 compare_nums() { sep="$3" readarray -d ""${sep:-,}"" -t a <<< "$1" readarray -d ""${sep:-,}"" -t b <<< "$2" [ ${a[0]} -gt ${b[0]} ] && return 1 [ ${a[0]} -lt ${b[0]} ] && return 2 [ ${a[1]} -gt ${b[1]} ] && return 1 [ ${a[1]} -lt ${b[1]} ] && return 2 return 0 }
readarray... ou IFS='.,' read -a a <<<$1, c'est pareil. je réserve readarray aux textes plus longs qu'une simple chaîne.
Je plussoie, mais faut quelque ajustement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ compare_nums 5,215 5,22 $ echo $? 1 $ compare_nums 5,215 5,21 $ echo $? 1 $ compare_nums 5 5,22 bash: [: -gt : opérateur unaire attendu bash: [: -lt : opérateur unaire attendu $ compare_nums 5,215 ,215 bash: [: 5 : opérateur unaire attendu bash: [: 5 : opérateur unaire attendu $ compare_nums 5 5 $ echo $? 1
Et quelques autres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $ compare_nums 5 5; echo $? 1
[edit]Ah pardon, j'avais pas vu que ce test avait aussi été fait par disedorgue (ascenseur sur son code). Marrant, on a tous les deux pris "5" comme exemple (peut-être j'ai été influencé par ses "5,215" initiaux)
[edit2]ok, j'ai fait les ajustements
Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 compare_nums() { sep="${3:-.,}" IFS="$sep" read -a a <<< "$1" IFS="$sep" read -a b <<< "$2" test -z "${a[0]}" && a[0]=0 test ${#a[@]} == 1 && a[1]=0 test -z "${b[0]}" && b[0]=0 test ${#b[@]} == 1 && b[1]=0 #echo "a=[${a[0]}] [${a[1]}]" #echo "b=[${b[0]}] [${b[1]}]" [ ${a[0]} -gt ${b[0]} ] && return 1 [ ${a[0]} -lt ${b[0]} ] && return 2 [ ${a[1]} -gt ${b[1]} ] && return 1 [ ${a[1]} -lt ${b[1]} ] && return 2 return 0 }![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Ou alors, je vais me découvrir des talents de mentaliste![]()
Cadeau....si on peut dire
(Espérons que je ne me sois pas plantouillé dans les copier/coller)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 cmp_dec(){ local yy printf -v yy '10#%.3f%s10#%.3f' $2 - $1 yy=${yy//10#-/-10#} printf -v res %.0f\\n "$((10**9 * (${yy//,/})))e-9" [[ "$res" -eq "0" ]] && echo $res || echo ${res//[0-9]*/1} } declare -A arr while read a b c do [[ $a && ${arr[$a]+a} ]] && { read x d e <<<${arr[$a]} [[ $(cmp_dec $d $b) -lt 0 ]] && arr[$a]="$a $b $c" true } || { [[ $a ]] && arr[$a]="$a $b $c" ; } done </tmp/xx.txt printf "%s\n" "${arr[@]}"
€dit: j'oubliais , le fichier /tmp/xx.txt c'est le fichier initial mais sans les lignes de commentaire comme par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 $ cat /tmp/xx.txt 1 -30,133 Orange 3 -30,133 Orange 1 -6,576 Banane 1 -6,293 Pomme 1 -12,034 Abricot 1 -7,076 Mûre 2 -4,355 Pomme 2 -6,517 Banane 2 -6,355 Abricot 2 -3,502 Mûre 3 30,133 Trange 3 -40 Rrange
pourquoi déclarer un tableau associatif ? a priori, les "noms" des groupes sont des nombres.
Comme ça, il n'y a pas le "à priori"![]()
vue la regex d'Hizoka, validée par Dorhub, je n'aurais même pas dû mettre "a priori". Et en le mettant, je me suis dit que ça allait chipoter.![]()
Le double tri est quand même sublime. Y a pas quelqu'un qui veut le passer en vert, par un pouce levé ?
Spécialement pour Jipété: https://forum.ubuntu-fr.org/viewtopic.php?id=2073578
je pense que c'est la source.
Je ne sais pas si l'adjectif "sublime" peut s'appliquer (ou alors c'est de l'humour mais il manque l'émoticon qui va bien). Parce que trier (là où un grep eût suffit) pour extraire le bon groupe puis retrier le flux initial (donc tout le fichier) là où le grep n'aurait sorti que les lignes utiles (donc moins de lignes à trier)...
Enfin j'ai mis le pouce vert pour l'élégance de l'instruction (et puis parce que c'est demandé gentiment)
Et (pour Jipété) chez-moi le lien a bien fonctionné. Mais on a fait remonter récemment des soucis d'affichage de pages et peut-être que c'est lié...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Ici, le code est complet et semble faire le job...
Mais je veux bien voir le même avec les 2 grep![]()
Je me suis mal exprimé. J'ai en effet cité deux fois "grep" mais les deux citations référençaient le même (le premier qui sert à extraire le groupe). Donc extraction, puis tri (ok là tri mais tri d'un nombre de lignes réduit) puis extraction premier élement. Style grep "^1 " fic | sort -nk2 | head -n 1.![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Ok, mais là, tu le fais pour un groupe, donc faut que tu boucles pour tous les groupes (que tu ne connais peut-être pas), donc oui, je fais 2 tris mais le second est très réduit puisqu'il ne fait qu'un uniq sur le champs 1.
Partager