Parcourir une chaîne en bash

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 :slightly_smiling:

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

Ce script requiert un seul parametre : un fichier texte construit de cette manière :

nombre_hexadecimal nom_utilisateur

nombre_hexadecimal nom_utilisateur

nombre_hexadecimal nom_utilisateur

nombre_hexadecimal nom_utilisateur

nombre_hexadecimal nom_utilisateur

et renvoie un fichier resultat.txt, formé de la même manière et dans lequel les nombres hexadécimaux auront été inversés et transformés en décimaux

0000000000102030 devient 3153936 (qui est le nombre 302010 en base 10, les 0 du début sont supprimés)

#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 :slightly_smiling:

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 :slightly_smiling:

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}"