Unix - COMPARA FOLIO awk

 
Vista:
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 14/04/2018 14:00:19
IChicos hola tengo una pregunta a ver si me pueden ayudar. Tengo un archivo de entrada a un proceso awk que los campos no tienen tabuladores ni espacio , del siguiente formato

NumerotelefonoFOLIO1iva1

NumerotelefonoFOLIO1iva2

NumerotelefonoFOLIO2iva1

NumerotelefonoFOLIO1iva3

Necesito sumar todos los valores de iva cuyo folio sea igual y rescatar el folio e iva por posicion. Ejemplo: si tengo folio1 el valor total debiera ser iva1+iva2+iva3 ademas de rescatar el valor total debo rwscatar el numero de folio.los folios estan desordenados. He pensado de todo y aun no se como hacerlo.

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

COMPARA FOLIO awk

Publicado por omar (1 intervención) el 14/04/2018 14:21:46
saludos

saludos, te puedo realizar una aplicación en otro lenguaje, Si deseas enviame un email

A tus ordenes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 14/04/2018 14:27:29
Gracias amigo pero necesito en awk :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 39
Ha mantenido su posición en Unix (en relación al último mes)
Gráfica de Unix

COMPARA FOLIO awk

Publicado por Antoni Masana (19 intervenciones) el 15/04/2018 07:51:58
Con el comando substr puedes coger un trozo del registro, la sintaxis es substr(Cadena, Inicio, longitud)

La pregunta es ¿El iva empieza siempre en la misma posición?
Es decir en tu ejemplo:

NumerotelefonoFOLIO1iva1
NumerotelefonoFOLIO1iva2
NumerotelefonoFOLIO2iva1
NumerotelefonoFOLIO1iva3

El primer campo en el texto Numerotelefono ¿Es un texto de 14 caracteres o es un número de 9 o 10 dígitos? ¿Siempre son de la misma longitud?
El segundo campo en el texto FOLIO1 ¿Es un texto de 6 caracteres o existe el FOLIO10? ¿Siempre es de la misma longitud?
El tercer campo en el texto iva1 ¿Es un campo numérico? ¿Tiene decimales? ¿Usa el punto con separador de decimales?
¿Has mas datos después del iva?
Si no sabes codificar una awk sube un ejemplo real y te creo el código porque con tu ejemplo no sirve. No se pueden sumar textos.
Si lo prefieres envíalo a mi correo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 15/04/2018 14:08:55
Si sabia rescatar posiciones por substring lo que me tiene complicada es la logica...
El folio tiene largo 12
Nummero largo10
Iva largo 9
Fecha largo 8 formato AAAAMMDD

Irian en este orden las columnas
Numerotelefonofolioivafecha

096876554540010000060000101200120180228

096876554540010000060000101211120180228

096876554540010000060000121200120180228

096876554540077000060000101200120180228

096876554540077000060000101200120180228

Todas las lineas estan contenidas en un archivo.. para este caso tengo las 3 primeras lineas con igual folio (posicion 11 largo 12) entonces debiera sumar los3 iva del mismo folio.. y las ultimas 2 lineas tienen un folio distinto entonces debiera sumar los 2 ivas.. mi idea es arrojarlos en un archivo
Folio; sumaiva

Por si despues debo utilizar nuevamente esa info
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 39
Ha mantenido su posición en Unix (en relación al último mes)
Gráfica de Unix

COMPARA FOLIO awk

Publicado por Antoni Masana (19 intervenciones) el 15/04/2018 20:07:03
Me pierdo

1
2
3
4
5
6
----+----1----+----2----+----3----+----
096876554540010000060000101200120180228
096876554540010000060000101211120180228
096876554540010000060000121200120180228
096876554540077000060000101200120180228
096876554540077000060000101200120180228

Segun entiendo la descrpciòn es la siguiente

1
2
3
4
5
6
----+----1-- --+----2-- --+----3- ---+----
096876554540 0100000600 001012001 20180228
096876554540 0100000600 001012111 20180228
096876554540 0100000600 001212001 20180228
096876554540 0770000600 001012001 20180228
096876554540 0770000600 001012001 20180228

Partiendo de esta descripción

1
2
3
4
5
Tipo      Long  Inicio  final   Observaciones
El folio    12       1     12
Numero      10      13     22
Iva          9      23     31
Fecha        8      32     39   AAAAMMDD

Este es el código para la AWK

1
2
3
4
5
6
7
BEGIN { Suma=0 }
NR==1 { Anter=substr($0,1,12)
      { Folio=substr($0, 1,12)
        Iva  =substr($0,23, 9); if(Anter==Folio) { Suma=Suma+Iva; next }
        printf("%s;%s\n"; Anter, Suma,);  Anter=Folio;  Suma=Iva
      }
END   { printf("%s;%s\n", Anter, Suma)

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 15/04/2018 20:31:52
Amigo! Los campos me explique mal

Telefono posicion 1-10 (largo 10)
Folio posicion 11-22 largo 12
Iva posicion 23-31 largo 9
Fecha 32 -39 largo 8

De todas maneras entendi la logica lo que si nose donde cerraste los { de la segunda y tercera linea
Ya que creo que le falto uno por cerrar pero nose donde se cerraria
1
2
3
4
5
6
7
BEGIN { Suma=0 }
NR==1 { Anter=substr($0,1,12)
      { Folio=substr($0, 1,12)
        Iva  =substr($0,23, 9); if(Anter==Folio) { Suma=Suma+Iva; next }
        printf("%s;%s\n"; Anter, Suma,);  Anter=Folio;  Suma=Iva
      }
END   { printf("%s;%s\n", Anter, Suma)


Que funcion cumpliria el NR en este caso? En la respuesta anterior tambien le envie un mail.. y la funcion next ignoraba que existia.. desde ya le agradezco inmensamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 15/04/2018 20:40:32
AMigo ese codigo me mostraria la suma de n cantidad de folio distinguiendo por folio? Eso se realiza en el end? Ya que entiendo que el end se ejecuta una vez que ya recorri todo el archivo... para este caso imprimiria una linea? O varias distinguiendo por folio?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 39
Ha mantenido su posición en Unix (en relación al último mes)
Gráfica de Unix

COMPARA FOLIO awk

Publicado por Antoni Masana (19 intervenciones) el 16/04/2018 09:26:27
Según lo que cuentas la cosa va así:

1
2
3
4
5
6
----+----1----+----2----+----3----+----
096876554540010000060000101200120180228
096876554540010000060000101211120180228
096876554540010000060000121200120180228
096876554540077000060000101200120180228
096876554540077000060000101200120180228

Segun entiendo la descrpciòn es la siguiente

1
2
3
4
5
6
----+----1 ----+----2-- --+----3- ---+----
0968765545 400100000600 001012001 20180228
0968765545 400100000600 001012111 20180228
0968765545 400100000600 001212001 20180228
0968765545 400770000600 001012001 20180228
0968765545 400770000600 001012001 20180228

Partiendo de esta descripción

1
2
3
4
5
Tipo      Long  Inicio  final   Observaciones
Telefono    10       1     10
El folio    12      11     22
Iva          9      23     31
Fecha        8      32     39   AAAAMMDD


Y este es el código revisado y corregido

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN { Suma=0 }
 
NR==1 { Anter=substr($0,11,12) }
 
      { Telef=substr($0, 1,10)
        Folio=substr($0,11,12)
        Iva  =substr($0,23, 9)
        Fecha=substr($0,32, 8); if(Anter==Folio) { Suma=Suma+Iva; next }
 
        printf("%s;%s;%s;%s\n", Telef, Anter, Suma, Fecha);
        Anter=Folio;
        Suma=Iva;
      }
 
END   { printf("%s;%s;%s;%s\n", Telef, Anter, Suma, Fecha) }

Lo hice anoche sin revisar y faltaba alguna cosa

Este es el resultado:

1
2
3
awk -f folio.awk texto.txt
0968765545;400100000600;3236113;20180228
0968765545;400770000600;2024002;20180228

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 16/04/2018 11:30:26
Amigo! los campos NR es solo para rescatar la linea? Lo otro el next reemplazaria al for? Muchas muchas gracias! Son mis unicas 2 dudas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 39
Ha mantenido su posición en Unix (en relación al último mes)
Gráfica de Unix

COMPARA FOLIO awk

Publicado por Antoni Masana (19 intervenciones) el 16/04/2018 18:09:21
El NR devuelve el numero de registro leido y lo utilizo para asignar valor al campo Anter y lo hago para que el primer registro no me de diferencia con el primer registro. Hay otras formas de hacerlo.

El next es en este caso para que salte al registro siguiente no procese el resto de lineas. También hay otra forma de hacerlo.

Ejemplo sin NR ni next

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BEGIN { Suma=0; Anter=="" }
 
      { Telef=substr($0, 1,10)
        Folio=substr($0,11,12)
        Iva  =substr($0,23, 9)
        Fecha=substr($0,32, 8)
 
        if(Anter=="") Anter=Folio  #La igualdad del IF solo se cumplida con el primer registro
 
        if(Anter==Folio) {
            Suma=Suma+Iva
        } else {
            printf("%s;%s;%s;%s\n", Telef, Anter, Suma, Fecha);
            Anter=Folio;
            Suma=Iva;
      }
 
END   { printf("%s;%s;%s;%s\n", Telef, Anter, Suma, Fecha) }

Y seguramente hay varias formas más de hacerlo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

COMPARA FOLIO awk

Publicado por MSXBOo (8 intervenciones) el 17/04/2018 03:30:15
Antoni
Muchas gracias por tu tiempo y ayuda aparte de solucionar mi problema me ayudaste a entenderlo.. de verdad muchas gracias desde latonioamerica!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar