Shell formatage fichier

Résolu
Ndiaye -  
 ndiaye -
Bonjour,

Bonjour,

J'ai de gros soucie pour formater mon fichier en utlisant un script shell:
Mon fichier de depart est :
cat fich 1:
85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|

je souhaite avoir le resultat suivant:
- la longueur de chaque enregitremant du fichier formaté ne doit pas depaser 200 caracteres.
- suivant les cas (030,050) inserer dans l'enr les information (001 AZERTY) ou (050 QUERTY)

Select Case
Case "030"
vProd = "001"
vLGrp = "AZERTY"
Case "050"
vProd = "003"
vLGrp = "QUERTY"
Case Else

fichier apres formatage

cat fich2:
0000000000001CH5 85884769370 DN17052010 2000000017 010000 AZERTY1206N0YSAINT LOUIS ** 001 001800Mr. MOUSSA SARR 01061982
0000000000002CH5 08235367539 DN17052010 2000000017 010000 QUERTY1301N0YLOUGA ** 003 002900Mr. BASSIROU DILLO 13081967

ceci est un exemple mais le format est beaucoups complexe.
je souhaite le script soit tres explicite et commente pour que je puisse l'adapter.

4 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    il faudrait expliquer comment tu passes de
    cat fich 1:
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|
    à 
    cat fich2:
    0000000000001CH5 85884769370 DN17052010 2000000017 010000 AZERTY1206N0YSAINT LOUIS ** 001 001800Mr. MOUSSA SARR 01061982
    0000000000002CH5 08235367539 DN17052010 2000000017 010000 QUERTY1301N0YLOUGA ** 003 002900Mr. BASSIROU DILLO 13081967
    
    0
    1. ndiaye
       
      bjr,

      Ds un premier temps je souhaite que fich1 resoit les valeurs suivant le case.
      cad:
      85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|001|AZERTY|
      08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|003|QUERTY|

      Deuxiement dans le soucis d'avoir un fichier formaté fixer sur 200 caracteres par enregistement,
      je charge mon fichier fich1 dans une table puis ajouter des données non variable.
      NB: dans la table toutes les colonnes sont declare en CHAR, de ce faite ces données seront extrat sous le format. fich2.les espace vide sont des données null.
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    pour la partie 1
    $ cat a1 
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010| 
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010| 
    $  
    $ cat a2 
    Select Case 
    Case "030" 
    vProd = "001" 
    vLGrp = "AZERTY" 
    Case "050" 
    vProd = "003" 
    vLGrp = "QUERTY" 
    Case Else 
    $  
    $ awk  -F"|" 'NF< 3 && /^Case/ {split($0,x,"\"")} ; NF<3 && /vLGrp/ {split($0,t,"\"");z[x[2]]=t[2]};NF> 4 { print $0 z[$2] FS}' a2 a1  
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|AZERTY| 
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|QUERTY| 
    $  
    
    0
    1. mlkndiaye
       
      ca marche mais j'ai oublie les valeurs vProd du case qui peuvent etre a la fin

      85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|AZERTY|
      08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|QUERTY|
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Merci dorénavant de donner le maximum de détails en posant votre question !!!

      Ça fait plusieurs posts où les gens se décarcassent pour rien (enfin façon de parler).
      0
    3. mlkndiaye
       
      pas de soucis je suis sur la pression, beaucoups ded choises a faire en meme temps
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    $ cat a1
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|
    $ 
    $ cat a2
    Select Case
    Case "030"
    vProd = "001"
    vLGrp = "AZERTY"
    Case "050"
    vProd = "003"
    vLGrp = "QUERTY"
    Case Else
    $ 
    $ awk -F"|" '/^Case/ {split($0,x,"\"")} ;/^vLGrp/ {split($0,t,"\"");z[1,x[2]]=t[2]};/^vProd/ {split($0,t,"\"");z[2,x[2]]=t[2]};NF> 4 { print $0 z[1,$2] FS z[2,$2] FS}' a2 a1
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|AZERTY|001|
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|QUERTY|003|
    $ 
    0
    1. mkndiaye
       
      Bjr Dubcek,

      Merci le script fonction tres bien.
      je passe a l'etape suivante qui est la dernier:
      Explication: Apres avoir injecte ces données ds une table puis mettre a jour la table, j'ai les données suivantes;
      cat a3
      85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|AZUR|001|0000||BN
      08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|VSEIMM|003|0000||FR
      53677448920|060|03500|Fatou |SILLA|27101965|COTE IVOIRE|17052010|VSPDEF|006|0000||SN

      je souhaite formater ce fichier en maintenant la taille de chaque colonne comme il ete declare dans la table. Pour cet exemple (CHAR 11 ;CHAR 3; CHAR 5; CHAR 15; CHAR 15; CHAR 8; CHAR 20; CHAR 8; CHAR 6; CHAR 3; CHAR 4; CHAR 4; CHAR 2;)
      d'ou le longueur de chaque enregistrement est 105.

      cat rslt:
      8588476937003001800Moussa sarr 01061982SAINT LOUIS 17052010AZUR 0010000 BN
      0823536753905002900Bassirou DILLO 13081967LOUGA 17052010VSEIMM0030000 FR
      5367744892006003500Fatou SILLA 27101965COTE IVOIRE 17052010VSPDEF0060000 SN
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      Ca fait une longueur de 104
      $ cat a3
      85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|AZUR|001|0000||BN
      08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|VSEIMM|003|0000||FR
      53677448920|060|03500|Fatou |SILLA|27101965|COTE IVOIRE|17052010|VSPDEF|006|0000||SN
      $ 
      $ awk -F"|" '{printf "%11s%3s%5s%15s%15s%8s%20s%8s%6s%3s%4s%4s%2s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13}' a3
      8588476937003001800        Moussa            sarr01061982         SAINT LOUIS17052010  AZUR0010000    BN
      0823536753905002900      Bassirou           DILLO13081967               LOUGA17052010VSEIMM0030000    FR
      5367744892006003500         Fatou           SILLA27101965         COTE IVOIRE17052010VSPDEF0060000    SN
      $ 
      
      0
    3. ndiaye
       
      je constate que les champs $4,$5,$7,$9,$13 sont ecrie a droite.
      je souhaite que tous les champs comence de la gauche vers la droite
      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    $ awk -F"|" '{printf "%11s%3s%5s%-15s%-15s%8s%-20s%8s%-6s%3s%4s%4s%-2s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13}' a3
    8588476937003001800Moussa         sarr           01061982SAINT LOUIS         17052010AZUR  0010000    BN
    0823536753905002900Bassirou       DILLO          13081967LOUGA               17052010VSEIMM0030000    FR
    5367744892006003500Fatou          SILLA          27101965COTE IVOIRE         17052010VSPDEF0060000    SN
    $  
    
    0
    1. ndiaye
       
      Oui ca marche, je vous remercie énormément de votre disponibilité.
      MERCI UNE FOIS DE PLUS.
      0