Shell formatage fichier

Résolu
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. Contributeur
    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
    
    1. 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.
  2. Contributeur
    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| 
    $  
    
    1. 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|
    2. Modérateur
      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).
    3. pas de soucis je suis sur la pression, beaucoups ded choises a faire en meme temps
  3. Contributeur
    $ 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|
    $ 
    1. 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
    2. Contributeur
      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
      $ 
      
    3. 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
  4. Contributeur
    $ 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
    $  
    
    1. Oui ca marche, je vous remercie énormément de votre disponibilité.
      MERCI UNE FOIS DE PLUS.