Shell script touchy

Résolu
chris -  
KuKrApOk59 Messages postés 444 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai un petit script à faire, voila ce que j'aimerai qu'il fasse:
j'ai un fichier source avec les données suivantes à l'interieur:
nom fich;var 1;var 2;var 3
fichier 1;titi;titi et tata;toto

et ainsi de suite pour chaque ligne (4 variables par lignes).
Au final, j'aimerai extraire pour chaque ligne, un fichier portant le nom de la 1ere variable, avec les autres variables insérées, par exemple:
fichier "nom fich" contenant les données:
ce fichier contient les données pour var 1 ainsi que pour var 2 mais aussi var 3.

Le texte sera toujours le meme pour chaque ligne, j'aurai ainsi pour le fichier "fichier 1":
ce fichier contient les données pour titi ainsi que pour titi et tata mais aussi toto.

Merci pour vous réponses à venir !

2 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    $ ls
    plop
    
    $ cat plop
    nom_fich;var 1;var 2;var 3
    fichier_1;titi;titi et tata;toto
    
    $ while IFS=';' read -r fich nom1 nom2 nom3; do touch "${fich}" && echo "Ce fichier contient les données pour ${nom1} ainsi que pour ${nom2} mais aussi ${nom3}." > "${fich}"; done < plop
    
    $ ls
    fichier_1  nom_fich  plop
    
    $ cat fichier_1
    Ce fichier contient les données pour titi ainsi que pour titi et tata mais aussi toto.
    
    $ cat nom_fich
    Ce fichier contient les données pour var 1 ainsi que pour var 2 mais aussi var 3.
    
    $

    ;-))
    0
    1. chris
       
      simplement (encore) parfait, merci !
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ cat a1
    nom fich;var 1;var 2;var 3
    fichier 1;titi;titi et tata;toto 
    $ 
    $ awk 'BEGIN{OFS=FS=";"};{print $2,$3,$4 > $1}' a1
    $ 
    $ head ???*
    ==> fichier 1 <==
    titi;titi et tata;toto 
    
    ==> nom fich <==
    var 1;var 2;var 3
    $
    
    0
    1. KuKrApOk59 Messages postés 444 Date d'inscription   Statut Membre Dernière intervention   84
       
      Je m'incruste, mais pour info,

      A quoi sert le 'OFS=FS' ?
      FS=";" est pour le délimiteur, OK, mais la premiere partie, je ne saisis pas

      Merci :)
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut,

      C'est pour fixer le séparateur en sortie (OutputFieldSeparator) qui par défaut est un espace.
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      OFS est le délimiteur en sortie. En faisant print $2,$3 la virgule représente OFS, par défaut <espace>, ici ;
       $ echo "aaa;bbb" | awk -F";" '{print $1,$2}'
      aaa bbb
      $ 
      $ echo "aaa;bbb" | awk 'BEGIN{FS=OFS=";"};{print $1,$2}'
      aaa;bbb
      $ 

      NB: -F";" et {FS=";"} sont equivalents
      0
    4. KuKrApOk59 Messages postés 444 Date d'inscription   Statut Membre Dernière intervention   84
       
      Merci pour ces éclaircissements !
      0