Préfixer des variables scripts shell

Résolu
Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
Merci beaucoup mais cette solution ne marche pas :(
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
Tu peux m'expliquer vite fait la commande stp ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
plus court
awk '{split($0, a, "\""); if(a[2]>=192000)sub("[0-9]", "S&");print}' fichier
0
Utilisateur anonyme
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
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
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
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
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
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 455 Date d'inscription   Statut Membre Dernière intervention   515
 
Ç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