Salut,
j’ai des nombres de ce type 0000000012345667 et je voudrais parcourir ce nombre pour faire une opération sur chaque chiffre. Ça doit pas être bien compliqué mais je sais pas faire.
Merci.
Salut,
j’ai des nombres de ce type 0000000012345667 et je voudrais parcourir ce nombre pour faire une opération sur chaque chiffre. Ça doit pas être bien compliqué mais je sais pas faire.
Merci.
Salut,
Tu devrais pouvoir t’en sortir avec un truc dans le genre :
Ligne à approfondir
J’ai plus simple :
Salut,
finalement j’ai fait une boucle en utilisant un while et cut mais je note pour awk. Si ça vous intéresse voilà mon script :
[code]#!bin/bash
#suppresion des zeros en debut du nombre
supprimerzero(){
nb=$1
zero=$(echo $nb | cut -c 1)
while [ “$zero” -eq 0 ]
do
nb=${nb:1}
zero=$(echo $nb | cut -c 1)
done
}
#renvoie les chiffre situé en position $2 dans le nombre $1
recupererchiffre() {
#recuperation de chaque caractere
chiffre=$(echo $1 | cut -c $2)
convertirchiffre $chiffre
chiffre=$conv
}
#convertit un chiffre hexadecimal en decimal
convertirchiffre() {
case $1 in
A) conv=10;;
B) conv=11;;
C) conv=12;;
D) conv=13;;
E) conv=14;;
F) conv=15;;
*) conv=$1;;
esac
}
#fonction principale
main(){
#extraction des numeros
nombrehexa=$(cat “$1” | cut -f 1 -d" ")
#parcours de la liste des hexa
for nb in $nombrehexa
do
#récupération de la longueur de la chaine
taille=${#nb}
nombreDec=0
#sppresion des zero du debut
supprimerzero $nb
#boucle sur la chaine
while [ $taille -gt 0 ]
do
#calcul en base 10
#recup du premier chiffre
recupererchiffre $nb $taille
taille=$((taille - 1))
#calcul
nombreDec=$((nombreDec + chiffre*16 ** (taille - 1) ))
#recup du deuxième chiffre
recupererchiffre $nb $taille
taille=$((taille - 1))
#calcul
nombreDec=$((nombreDec + chiffre*16 ** (taille + 1) ))
done
nomUtilisateur=$(cat "$1" | grep $nb | cut -f 2 -d" ")
echo $nb" "$nombreDec" "$nomUtilisateur | tee -a "resultats.txt"
done
}
if [ ! -f “$1” -o -z “$1” ]
then echo "Vous devez saisir un nom de fichier comme premier paramètre du script"
else
main $1
fi
[/code]
Y’a surement moyen de faire plus simple mais j’ai pas l’habitude de programmer en bash. Toute remarque est la bienvenue
Le but c’est de transformer un fichier de ce type :
000000006128091E dupont
000000006138012E durand
000000006148034E dupond
en un autre fichier ou les nombres en hexadecimaux sont transformés en décimaux. Le problème c’est que les hexa sont à l’envers et par groupe de deux! Par exemple dans le nombre 000000006128091E, je veux calculer le décimal de 1E092861 (faut virer les 0 du début aussi).
a+
Plutot que de faire un echo … cut pour chaque caractère
et un cat du fichier à chaque fois que tu veux un champs,
tu devrais utiliser les possibilités offertes par read :
#!/bin/bash
function traiter_exa {
DEC=0
N=1
while read -n 1 C; do
DEC=$((DEC + C * N))
N=$((N * 16))
done
echo $DEC
}
while read EXA USR; do
DEC=$(echo $EXA | traiter_exa)
echo $DEC $USR
done <"$1"
Après fait attention parce que je ne suis pas sûr que ma méthode soit valide pour le calcul demandé,
mais tu as la structure générale (qui est bien plus élégante et performante que plein de cat et de cut).
@bbt1
Je n’arrive pas à faire fonctionner ton code. On dirait qu’il y a un conflit sur l’entrée standard car car quand le programme rentre dans le premier while puis le second , il n’arrive plus à reprendre la première boucle.
T’as du te rater quelque part, je viens de le copier coller dans hexa_to_dec.sh
je crée un fichier fic avec le contenu suivant :
123 baba
456 toto
et je fais ./hexa_to_dec.sh fic
et j’ai un résultat cohérent (enfin j’ai un résultat quoi).
$ ./hexa_to_dec.sh fic
801 baba
1620 toto
Si vraiment tu bloques, rajoute un set -x au début du script.
Bon ça cloche ce que j’essaye de faire mais tant pis, je reprendrai ça calmement après ma semaine de vacances
a+
Ça peut se faire avec un uniligne :
Ça marche au moins avec GNU awk je sais pas pour le reste (peut être que perl peut faire plus court encore).
Edit: en fait pas sur que perl fasse plus court
Bonsoir,
Pour effectuer une conversion de hexa à decimale :
Exemple :
$valHexa="AF"
$valDec=$(bc <<< "ibase=16;${valHexa}")
$echo "${valDec}"
175
Par ailleurs, cela peut-être réalisé directement en bash :
#!/bin/bash
fichier="$1"
while read valHexa valUser
do
echo "$((16#${valHexa}*1)) ${valUser}"
done < "${fichier}"