Préfixer des variables scripts shell

Résolu
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.

4 réponses

  1. Contributeur
    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
    1. Merci beaucoup mais cette solution ne marche pas :(
  2. Contributeur
    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
    1. Tu peux m'expliquer vite fait la commande stp ?
    2. Contributeur
      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
    3. Contributeur
      plus court
      awk '{split($0, a, "\""); if(a[2]>=192000)sub("[0-9]", "S&");print}' fichier
  3. 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
    1. 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 :)
      1. 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
      2. 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
      3. par exemple:
        while read -r line; do echo "$line"; done < <(cat test{,2}.prn)

        il te faut adapter à ma proposition précédente.
      4. qqchquicommenceparQ merci pour ton implication, mais vraiment je ne m'y connais absolument pas en shell. Pour moi tout ça n'est pas clair.
      5. Ç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