Gawk будет лучше, с его конкретной поддержкой полей фиксированной ширины. (Найдите переменную FIELDWIDTHS.)
Также легко написать простые правила для фильтрации мусора, который вы получите.
Вот простой скрипт, который просто дает вам «важные» строки и сопоставления переменных из того отчета, с которым вы связались:
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;
}
Честно говоря, я думаю, это довольно чисто, но я (g) awk fanboi.
Редактировать - я добавил код, чтобы вытащить номер и имя пользователя. Номер пользователя - это поле 2 из фиксированных полей, но имя пользователя должно быть в substr (), так как оно перекрывает многие поля сведений.