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.

4 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. Benoit A. Messages postés 455 Date d'inscription   Statut Membre Dernière intervention   515
       
      Merci beaucoup mais cette solution ne marche pas :(
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. 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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      plus court
      awk '{split($0, a, "\""); if(a[2]>=192000)sub("[0-9]", "S&");print}' fichier
      0
  3. 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
  4. 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
    1. 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
    2. 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
    3. 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
    4. 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
    5. 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