Gawk serait mieux, avec son support spécifique pour les champs de largeur fixe. (Recherchez la variable FIELDWIDTHS.)
Il est également facile d'écrire les règles simples pour filtrer les déchets que vous obtiendrez.
Voici un script simple qui vous donne juste les « importants » lignes et les correspondances variables de ce rapport que vous avez lié à:
BEGIN {
FIELDWIDTHS="4 4 7 5 1 7 1 1 23 4 10 2 1 2 8 1 6 1 4 1 6 1 2 1 2 1 2 1 4 2 10 1"
}
function cvt_amt(a) {
gsub(",", "", a);
amt = a * 1;
return amt;
}
function empty(s) {
gsub(" ", "", s);
return s == "";
}
/* skip garbage lines */
/----/ { next; }
/CASH RECEIPTS REPORT/ { next;}
/PERIOD ENTERED/ { next; }
/^ *$/ { next; }
($2 == "CUST") { next; }
($2 == "NO. ") { next; }
/CUSTOMER TOTALS/ { next; }
/GRAND TOTALS/ { next; }
/SUMMARY BY STATUS/ { nextfile; } /* end of stuff we care about */
/* Identify user */
(!empty($2)) {
user_no = $2;
user_name = substr($0, 10, 30);
}
{
/* variable mapping */
cust_no = $2;
vchr_no = $4;
inv_no = $6;
inv_no_sign = $7;
inv_desc = $9;
recv_amt = cvt_amt($11);
st = $13;
recv_date = $15;
check_no = $17;
period = $19;
batch = $21;
bank = $23;
cc = $25;
dp = $27;
acct = $29;
amt_recv = cvt_amt($31);
sign = $32;
if (sign == "-") {
amt_recv = amt_recv * -1;
}
print;
}
Franchement, je pense que cela est assez propre, mais je suis un (g) awb fanboi. Editer - J'ai ajouté du code pour extraire le numéro et le nom de l'utilisateur. Le numéro d'utilisateur est le champ 2 à partir des champs fixes, mais le nom d'utilisateur a fallu substr() out, car il chevauche de nombreux champs de détail.
Avez-vous déjà choisi une solution pour vos besoins? –