|
La fusión de los archivos con AWK y contar las líneas de filtración
Hola,
Tengo un par de archivos que necesito para fusionar. Que puedo hacer por una simple combinación de concatenar en un archivo más grande.
Pero luego tengo que filtrar el archivo para obtener un resultado deseado.
La salida es similar al siguiente:
Código:
TRNH 0000000010941
ORDH
OADR
OADR
ORDL
ENDT 1116399 000000003 000000001
TRLR 0000000010941 000000003 000000001
TRNH 0000000010942
ORDH
OADR
OADR
ORDL
ENDT 1116400 000000003 000000001
TRLR 0000000010942 000000003 000000001
TRNH 0000000010943
ORDH
OADR
OMSG
ORDL
ORDL
ENDT 1116399 000000004 000000001
TRLR 0000000010943 000000003 000000001
TRNH 0000000010944
ORDH
OADR
OADR
ORDL
ENDT 1116400 000000003 000000001
ORDH
OADR
OADR
ORDL
ORDL
ENDT 1116400 000000004 000000001
TRLR 0000000010944 000000007 000000002
y el filtrado debe salir de la primera y la última línea con el TRNH y TRLR (dando los últimos TRLR la misma secuencia que la primera TRNH). El resto de la TRNH y TRLR líneas deben ser omitidos.
Entonces el final TRLR debe representar la cantidad de líneas ORDH y la cantidad de OADR, OMSG y ORDL líneas.
No he llegado a la supresión de la extra TRNH y líneas TRLR aún, este es el filtro que he hasta la fecha:
Código:
BEGIN {
# define two counters
ordh_cnt = 0;
ordl_total_cnt = 0;
}
# Start filter
# if line start with ORDH add 1 to counters
$1 == "ORDH" {
ordh_cnt++;
}
# if line starts with TRLR, adjust line to reflect new count of ORDH in order
$1 == "TRLR" {
printf "%s%9.9d%s\n", substr($0, 0, 31), ordh_cnt, substr($0, 39);
# line has been printed, next rule
next;
}
# if line start with ORDL add 1 to counters
$1 == "ORDL" {
ordl_total_cnt++;
}
# if line start with OADR add 1 to counters
$1 == "OADR" {
ordl_total_cnt++;
}
# if line start with OMSG add 1 to counters
$1 == "OMSG" {
ordl_total_cnt++;
}
# if line starts with TRLR, adjust line to reflect new total ORDL, OADR and OMSG in complete file
$1 == "TRLR" {
printf "%s%9.9d%s\n", substr($0, 0, 19), ordl_total_cnt, substr($0, 29);
# line has been printed, next rule
next;
}
# Line has not changed, print normal line
{
print $0;
}
Ahora, la cantidad de líneas es ORDH salida a mi nuevo archivo, de manera que parece funcionar. Sin embargo, la cantidad de OADR, OMSG y ORDL líneas no se corrige en la salida.
El resultado final debe ser como este:
Código:
TRNH 0000000010941
ORDH
OADR
OADR
ORDL
ENDT 1116399 000000003 000000001
ORDH
OADR
OADR
ORDL
ENDT 1116400 000000003 000000001
ORDH
OADR
OMSG
ORDL
ORDL
ENDT 1116399 000000004 000000001
ORDH
OADR
OADR
ORDL
ENDT 1116400 000000003 000000001
ORDH
OADR
OADR
ORDL
ORDL
ENDT 1116400 000000004 000000001
TRLR 0000000010941 000000017 000000005
Cualquier ayuda sería muy apreciada
|