Bonjour,

Mon but est de transformer un fichier via un script AWK

Fichier initial: fic1.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
Fichier qui doit être généré: fic2.csv
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;
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
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.
}
Suite de commandes awk pour parvenir au résultat souhaité
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;/COLONNE1 COL2/{f=1}' --> suppression de l'en-tête du fichier
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