Préfixer des variables scripts shell

Résolu/Fermé
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 - Modifié par zipe31 le 17/04/2014 à 13:18
 Utilisateur anonyme - 17 avril 2014 à 18:52
Bonjour,

A l'aide d'un script shell, je récupère des ID allant de 1 à 192000. Je souhaiterais créer une formule (While ? peut-être), qui me préfixerait tous mes ID supérieur à 192000 par un S.

Pour info, cette ID est récupéré en colonne 1 dans un autre fichier.

Exemple:

Fichier témoin
ID;Info
191263;Toto
192000;Tutu
192001;Tata
192002;Tete

Ce qui m'est demandé en fichier de sortie:

ID;Info
191263;Toto
192000;Tutu
S192001;Tata
S192002;Tete

J'espère avoir été le plus claire possible. Merci pour votre aide.
A voir également:

4 réponses

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
17 avril 2014 à 13:06
les " changent un peu le format, essayer
awk 'BEGIN {FS=OFS=";"} {x=$1; gsub("\"", "", x); if(x>=192000)sub("[0-9]", "S&", $1); print}' fichier
2
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 15:35
Merci beaucoup mais cette solution ne marche pas :(
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
17 avril 2014 à 12:42
hello
$ awk 'BEGIN {FS=OFS=";"} $1>=192000 && $1 ~/^[0-9]*$/ {$1="S" $1} {print}' fichier
ID;Info
191263;Toto
S192000;Tutu
S192001;Tata
S192002;Tete
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 12:43
Tu peux m'expliquer vite fait la commande stp ?
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
17 avril 2014 à 12:52
BEGIN {FS=OFS=";"} on définit ; comme séparateur de champs en entrée et en sortie
$1>=192000 && $1 ~/^[0-9]*$/ {$1="S" $1} si le champ 1 est >= à 192000 et ne contient que des chiffres, on le prefixe avec S
{print} on imprime
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
17 avril 2014 à 13:44
plus court
awk '{split($0, a, "\""); if(a[2]>=192000)sub("[0-9]", "S&");print}' fichier
0
Utilisateur anonyme
17 avril 2014 à 12:45
salut,

un boucle while, toujours, pour lire un fichier !
while read -r line
do echo "$line"
done < fichier
ensuite pour séparer les valeurs contenues sur une ligne, il faut modifier l'IFS (Internal Field Separator) pour l'environnement de la commande
read
, et
test
er la valeur du premier champ:
while IFS=';' read -r champ_1 reste_de_la_ligne
do test $champ_1 -gt 192000 && s=S || s=""
echo "$s$champ_1;$reste_de_la_ligne"
done < fichier
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
Modifié par Benoit A. le 17/04/2014 à 12:58
Heu là ça devient compliqué pour moi ... Je n'ai jamais fais de shell.

Voici ce que j'ai moi dans le fichier actuel en .sh

cp -p test.prn test.full.prn
cp -p test2.prn test2.full.prn

# Suppression des duplicats
cat test.full.prn | sort -u | sort -t\; -k1,1 -k2.8,2.11 -k2.5,2.6 -k2.2,2.3 > test.prn
cat test2.full.prn | sort -u | sort -t\; -k1,1 -k2.8,2.11 -k2.5,2.6 -k2.2,2.3 > test2.prn

exit 0


Sachant que dans test.prn et test2.prn j'ai des lignes comme ça :

"100000";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";



Et donc moi ce que je souhaiterais en recréant les fichiers test.prn et test2.prn qu'à partir de la ligne 192000 que ça donne ça :

"S192001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";


Est-ce que vous voyez ce que je veux dire ?


En tout cas merci pour votre aide :)
0
Utilisateur anonyme
17 avril 2014 à 13:14
while IFS=';' read -r champ_1 reste_de_la_ligne
do test ${champ_1//\"/} -gt 192000 && s=S || s=""
echo "\"$s$champ_1\";$reste_de_la_ligne"
done < fichier
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 14:15
Et je dois répéter ça deux fois pour les deux fichiers ?

while IFS=';' read -r champ_1 reste_de_la_ligne
do test ${champ_1//\"/} -gt 192000 && s=S || s=""
echo "\"$s$champ_1\";$reste_de_la_ligne"
done < test.prn && test2.prn
0
Utilisateur anonyme
17 avril 2014 à 14:22
par exemple:
while read -r line; do echo "$line"; done < <(cat test{,2}.prn)

il te faut adapter à ma proposition précédente.
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 14:28
qqchquicommenceparQ merci pour ton implication, mais vraiment je ne m'y connais absolument pas en shell. Pour moi tout ça n'est pas clair.
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
Modifié par Benoit A. le 17/04/2014 à 14:44
Ça pourrait marcher ça ???


lmt=192000

cp -p test.prn test.full.prn
cp -p test2.prn test2.full.prn

# Suppression des duplicats
cat test.full.prn | sort -u | sort -t\; -k1,1 -k2.8,2.11 -k2.5,2.6 -k2.2,2.3 > test.prn
cat test2.full.prn | sort -u | sort -t\; -k1,1 -k2.8,2.11 -k2.5,2.6 -k2.2,2.3 > test2.prn

#Ajout du préfixe "S"
while IFS=';' read -r -k1 ID
do test ${ID//\"/} -gt $lmt && s=S || s=""
echo "\"$s$ID\";$ID"
done < test.prn

while IFS=';' read -r -k1 ID
do test2 ${ID//\"/} -gt $lmt && s=S || s=""
echo "\"$s$ID\";$ID"
done < test2.prn

exit 0

Merci de ta patience
0