Bonjour,
Mon but est de transformer un fichier via un script AWK
Fichier initial: fic1.csv
Fichier qui doit être généré: fic2.csv
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Date: 27-Sep-2019 Description 1 Description 2 Description 3 Entete 1 COLONNE1 COL2 XXX XXXXXXXXXXXX XXXXX 123456789 FR12345 CEXXXXXX DUPONT HENRI 12-08-1950 12800 GU 120 EUR CARTE CREDIT 11 123456789 FR12345 CEXXXXXX DUPONT HENRI 12-08-1950 12800 GA 150 EUR CARTE DEBIT 20 412566655 FR43333 CEXXXXXX MARTIN LUCIEN 20-02-2000 13200 GA 420 EUR CARTE DEBIT 1 842216654 FR8523 CEXXXXXX LECOMTE CATHERINE 21-08-1989 43520 GC 25000 EUR CARTE DEBIT 15 9876543210 FR456788 CEXXXXXX MARTIN JACQUES 21-08-1902 94250 GA 3600 EUR CARTE DEBIT 58 9876543210 FR456788 CEXXXXXX MARTIN JACQUES 21-08-1902 94250 GC 25000 EUR CARTE DEBIT 120
J'ai réussi à le faire avec une suite de commandes awk, mais je ne parviens pas à écrire un seul script awk du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 1;412566655;FR43333;MARTIN;LUCIEN;20-02-2000;13200;EUR;CARTE;GA;420;DB;1; 2;123456789;FR12345;DUPONT;HENRI;12-08-1950;12800;EUR;CARTE;GU;120;CR;GA;150;DB;31; 1;842216654;FR8523;LECOMTE;CATHERINE;21-08-1989;43520;EUR;CARTE;GC;25000;DB;15; 2;9876543210;FR456788;MARTIN;JACQUES;21-08-1902;94250;EUR;CARTE;GA;3600;DB;GC;25000;DB;178;
Suite de commandes awk pour parvenir au résultat souhaité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 BEGIN { # Things to be done before you start processing rows. } { # Things to be done for each row. } END { # Things to be done after processing the last row. }
awk 'f;/COLONNE1 COL2/{f=1}' --> suppression de l'en-tête du fichier
Code : Sélectionner tout - Visualiser dans une fenêtre à part cat test.csv | awk 'f;/COLONNE1 COL2/{f=1}' | awk -F'\t' '$1!=""' | awk -F' ' '{$3=""}1' | awk '{$1=$1};1' FS=";" | awk '{$2=$2};1' OFS=";" | awk 'BEGIN{FS=OFS=";"} {if ($11=="CREDIT") {$11="CR"} else {$11="DB"}}1' | awk '{print $0";"}' | awk -F';' '{occ[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]++;sum[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]+=$12;a[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]=a[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10] ";" $7 ";" $8 ";" $11} END {for (k in a) {print occ[k] ";" k a[k] ";" sum[k] ";"}}'
awk -F'\t' '$1!=""' --> suppression des lignes blanches à la fin du fichier
awk -F' ' '{$3=""}1' --> suppression du 3ème champ
awk '{$1=$1};1' FS=" " --> suppression des espaces inutiles entre les champs
awk '{$2=$2};1' OFS=";" --> séparateur est un ';' au lieu d'un ' '
awk 'BEGIN{FS=OFS=";"} {if ($11=="CREDIT") {$11="CR"} else {$11="DB"}}1' --> changementCREDIT en CR et DEBIT en DB
awk '{print $0";"}' --> ajout d'un ';' à la fin de chaque ligne
awk -F';' '{occ[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]++;sum[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]+=$12;a[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10]=a[$1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $6 ";" $9 ";" $10] ";" $7 ";" $8 ";" $11} END {for (k in a) {print occ[k] ";" k a[k] ";" sum[k] ";"}}' --> regroupement en fonction des champs "$1 - $2 - $3 - $4 - $5 - $6 - $9 - $10"; ajout nombre d'occurrence en début de ligne; cumul du dernier champ
Merci de votre aide
Partager