Shell formatage fichier

Résolu/Fermé
Ndiaye - 22 mai 2010 à 00:14
 ndiaye - 23 mai 2010 à 13:12
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.




A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
22 mai 2010 à 08:50
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
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 22/05/2010 à 15:28
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
22 mai 2010 à 17:01
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
pas de soucis je suis sur la pression, beaucoups ded choises a faire en meme temps
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 mai 2010 à 08:50
$ 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
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 mai 2010 à 10:46
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
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 mai 2010 à 13:01
$ 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
Oui ca marche, je vous remercie énormément de votre disponibilité.
MERCI UNE FOIS DE PLUS.
0