Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ramos_45 en 26 Septiembre 2018, 22:51 pm



Título: ayuda con pequeño script
Publicado por: ramos_45 en 26 Septiembre 2018, 22:51 pm
Buenas a todos.

Hace años estuve registrado en este foro pero por algún motivo , tal vez inactividad , mi cuenta no existía.

El motivo de este post, es para ver si algún gurú me podría hacer un script muy simple, ya que yo desconzco de programacion, aunque soy capaz de editar algo de codigo.explicó el caso.

Tengo unos documentos txt de gcode(programación cnc) los cuales llevan diferentes líneas.
En cada línea lleva un código de grupo,por ejemplo un sería DMN_101. En medio de la línea.

Necesito eliminar completamente las líneas que contengan diversos códigos de estos que yo le asigne, y que el resto las dejé intactas, es decir, en el siguiente ejemplo:

Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

Si yo quisiera eliminar las UAN_202 y UIU_111, simplemente me dejara las 2 líneas con DMN_101 y me creara otro txt con el nombre "FILTRADO (nombre original).txt) a poder ser


Espero haberme explicado, un saludo


Título: Re: ayuda con pequeño script
Publicado por: EdePC en 27 Septiembre 2018, 02:20 am
Saludos,

- En la Command Line de Windows (cmd) puedes utilizar el comando FIND con el modificador /v para que imprima las líneas que NO contengan la palabra buscada, y opcionalmente utilizar /i para no distinguir mayúsculas de minúsculas:

Código
  1. copy con doc.txt
  2. Xxxxxxxxx DMN_101. Xxxxxxxxx
  3. Xxxxxxxxx UAN_202 xxxxxxxxx
  4. Xxxxxxxxx UIU_111 xxxxxxxxx
  5. Xxxxxxxxx DMN_101xxxxxxxxx^Z
  6.        1 archivo(s) copiado(s).
  7.  
  8. type doc.txt
  9. Xxxxxxxxx DMN_101. Xxxxxxxxx
  10. Xxxxxxxxx UAN_202 xxxxxxxxx
  11. Xxxxxxxxx UIU_111 xxxxxxxxx
  12. Xxxxxxxxx DMN_101xxxxxxxxx
  13.  
  14. find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" > FILTRADO_doc.txt
  15.  
  16. type FILTRADO_doc.txt
  17.  
  18. ---------- DOC.TXT
  19. Xxxxxxxxx DMN_101. Xxxxxxxxx
  20. Xxxxxxxxx DMN_101xxxxxxxxx


Título: Re: ayuda con pequeño script
Publicado por: nokia-6260 en 27 Septiembre 2018, 02:41 am
Así sin mirar mucho y con esto de aprender un poco de python hice este script , según mis pruebas funciona, aunque seguro que se puede hacer mil veces mejor.
Saludos.

#!/usr/bin/env python

file_r = open("Tu_home/sin_filtrar.txt",'r')
file_w = open("/Tu_home/filtrado.txt", 'w')

lines = file_r.readlines()

for i in lines:
    print(i)
    resul_UAN_202 = i.find('UAN_202')
    resul_UIU_111 = i.find('UIU_111')
    if ((resul_UAN_202 > 0) or  (resul_UIU_111 >0)):
        print("borrar")
    else:
        file_w.write(i)   
print(lines)       


Título: Re: ayuda con pequeño script
Publicado por: animanegra en 27 Septiembre 2018, 10:24 am
Si es solo eliminar las lineas que cumplan un patron puedes tambien simplemente usar grep que para eso está:

Citar

cat fichero_de_entrada | grep -v "patron_a_quitar_1\|patron_a_quitar_2\|patron_a_quitar_3" > fichero_de_salida


Saludos.


Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 27 Septiembre 2018, 11:26 am
Gracias por vuestras respuestas!

Saludos,

- En la Command Line de Windows (cmd) puedes utilizar el comando FIND con el modificador /v para que imprima las líneas que NO contengan la palabra buscada, y opcionalmente utilizar /i para no distinguir mayúsculas de minúsculas:

Código
  1. copy con doc.txt
  2. Xxxxxxxxx DMN_101. Xxxxxxxxx
  3. Xxxxxxxxx UAN_202 xxxxxxxxx
  4. Xxxxxxxxx UIU_111 xxxxxxxxx
  5. Xxxxxxxxx DMN_101xxxxxxxxx^Z
  6.        1 archivo(s) copiado(s).
  7.  
  8. type doc.txt
  9. Xxxxxxxxx DMN_101. Xxxxxxxxx
  10. Xxxxxxxxx UAN_202 xxxxxxxxx
  11. Xxxxxxxxx UIU_111 xxxxxxxxx
  12. Xxxxxxxxx DMN_101xxxxxxxxx
  13.  
  14. find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" > FILTRADO_doc.txt
  15.  
  16. type FILTRADO_doc.txt
  17.  
  18. ---------- DOC.TXT
  19. Xxxxxxxxx DMN_101. Xxxxxxxxx
  20. Xxxxxxxxx DMN_101xxxxxxxxx


Entiendo que con ese codigo solo usarías las líneas 1,8,14y 16 no? El resto que pones es lo que respondería.

Los tengo muchos códigos que copiar para eliminar, unos 80,y posteriormente tal vez tenga que añadir más. Este script yo sabría modificarlo y añadirlos, pero lo van a usar otras personas que no. Habría la posibilidad de al inicio crear un menú que te pregunte si quieres añadir o quitar códigos?

Se podría simplificar la línea:
find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" >

Para no tener que poner así los 80 códigos?



Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 27 Septiembre 2018, 11:28 am
Así sin mirar mucho y con esto de aprender un poco de python hice este script , según mis pruebas funciona, aunque seguro que se puede hacer mil veces mejor.
Saludos.

#!/usr/bin/env python

file_r = open("Tu_home/sin_filtrar.txt",'r')
file_w = open("/Tu_home/filtrado.txt", 'w')

lines = file_r.readlines()

for i in lines:
    print(i)



    resul_UAN_202 = i.find('UAN_202')
    resul_UIU_111 = i.find('UIU_111')
    if ((resul_UAN_202 > 0) or  (resul_UIU_111 >0)):
        print("borrar")
    else:
        file_w.write(i)   
print(lines)       



Muchas gracias, yo creo que sí. En batch se crearlo, pero como lo copió y ejecutó para phyton?


Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 27 Septiembre 2018, 11:29 am
Si es solo eliminar las lineas que cumplan un patron puedes tambien simplemente usar grep que para eso está:

Saludos.


Sería ideal pero lo necesito para Windows


Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 27 Septiembre 2018, 11:33 am
Gracias por vuestras respuestas y vuestra ayuda.

Se podría añadir el documento arrastrando?

Se me a ocurrido otra opción que me ayudaría mucho, y sería resaltar en colores cuando encuentre diversas cosas. Por ejemplo:

Xxxxxxxxx DMN_101. XxxxxxM03xx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxM00xxx


Cuando encuentre M03, me lo pinte de verde y cuando encuentre M03 me lo pinte de rojo

Obviamente, tendría que ser en la consola, pero me gustaría también que exportará como hemos dicho antes(aunque aquí no pueda tener colores)


Título: Re: ayuda con pequeño script
Publicado por: **Aincrad** en 27 Septiembre 2018, 14:06 pm
1) No hagas doble o mas post seguidamente, lee las reglas.




Se podría añadir el documento arrastrando?


Esto solo lo permite la CMD a partir de Windows 7. aquí te dejo un ejemplo:

Código
  1. @echo off
  2. goto menu
  3. :err
  4. echo Error :v . & pause & goto menu
  5.  
  6. :continue
  7. echo tu archivo es %op%
  8. pause & exit
  9.  
  10.  
  11. :menu
  12. cls
  13. echo/
  14. echo introduzca el directorio del archivo / o Arrastre.
  15. echo/
  16. set /p op= --------------- :
  17. if not defined op (goto:menu) >NUL
  18. if not exist %op% (goto:err) >NUL
  19. goto continue



Se me a ocurrido otra opción que me ayudaría mucho, y sería resaltar en colores cuando encuentre diversas cosas. Por ejemplo:

Xxxxxxxxx DMN_101. XxxxxxM03xx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxM00xxx


Cuando encuentre M03, me lo pinte de verde y cuando encuentre M03 me lo pinte de rojo


Ya esto no lo vas a lograr con batch.


Título: Re: ayuda con pequeño script
Publicado por: EdePC en 27 Septiembre 2018, 17:06 pm
- Gracias a FINDSTR puedes hacer uso de un fichero aparte que contenga todas las palabras que quieres filtrar:

Código
  1. C:\Users\EdSon\Desktop>type doc.txt
  2. Xxxxxxxxx DMN_101. Xxxxxxxxx
  3. Xxxxxxxxx UAN_202 xxxxxxxxx
  4. Xxxxxxxxx UIU_111 xxxxxxxxx
  5. Xxxxxxxxx DMN_101xxxxxxxxx
  6.  
  7. C:\Users\EdSon\Desktop>type filtro.txt
  8. UAN_202
  9. UIU_111
  10.  
  11. C:\Users\EdSon\Desktop>findstr /v /i /g:filtro.txt doc.txt
  12. Xxxxxxxxx DMN_101. Xxxxxxxxx
  13. Xxxxxxxxx DMN_101xxxxxxxxx



- Puedes crear un fichero .bat (o .cmd) para utilizar el código que ha compartido **Aincrad** y en lugar de poner:

Código
  1. echo tu archivo es %op%

-- pondrías:

Código
  1. findstr /v /i /g:filtro.txt %op% > FILTRADO_%op%

-- No te olvides del fichero filtro.txt donde están las palabras a filtrar. Si el script encuentra dicha palabra en una línea elimina toda esa línea.



- Colorear en CMD si es posible pero no muy práctico, se puede utilizar el mismo FINDSTR con el modificador /A, el detalle es que solo colorea los nombres de los ficheros que contienen la palabra a buscar, por ende se tendría que crear tantos ficheros como líneas haya en tu fichero doc.txt



Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 27 Septiembre 2018, 18:07 pm
- Gracias a FINDSTR puedes hacer uso de un fichero aparte que contenga todas las palabras que quieres filtrar:

Código
  1. C:\Users\EdSon\Desktop>type doc.txt
  2. Xxxxxxxxx DMN_101. Xxxxxxxxx
  3. Xxxxxxxxx UAN_202 xxxxxxxxx
  4. Xxxxxxxxx UIU_111 xxxxxxxxx
  5. Xxxxxxxxx DMN_101xxxxxxxxx
  6.  
  7. C:\Users\EdSon\Desktop>type filtro.txt
  8. UAN_202
  9. UIU_111
  10.  
  11. C:\Users\EdSon\Desktop>findstr /v /i /g:filtro.txt doc.txt
  12. Xxxxxxxxx DMN_101. Xxxxxxxxx
  13. Xxxxxxxxx DMN_101xxxxxxxxx



- Puedes crear un fichero .bat (o .cmd) para utilizar el código que ha compartido **Aincrad** y en lugar de poner:

Código
  1. echo tu archivo es %op%

-- pondrías:

Código
  1. findstr /v /i /g:filtro.txt %op% > FILTRADO_%op%

-- No te olvides del fichero filtro.txt donde están las palabras a filtrar. Si el script encuentra dicha palabra en una línea elimina toda esa línea.



- Colorear en CMD si es posible pero no muy práctico, se puede utilizar el mismo FINDSTR con el modificador /A, el detalle es que solo colorea los nombres de los ficheros que contienen la palabra a buscar, por ende se tendría que crear tantos ficheros como líneas haya en tu fichero doc.txt





he probado, y el  ejemplo de aincrad funciona perfecto, pero si le añado como me has dicho tu no funciona. tampoco me funciona tu primer ejemplo.


Título: Re: ayuda con pequeño script
Publicado por: EdePC en 28 Septiembre 2018, 20:47 pm
- Pues primero tiene que crear un fichero de texto: filtro.txt que contendrá todas las palabras a buscar (ver mi TYPE filtro.txt)

- Luego usas FINDSTR para hacer referencia a dicho fichero, el fichero filtro.txt tiene que encontrarse en la misma carpeta donde ejecutas el FINDSTR (en mi caso C:\Users\EdSon\Desktop), auqnue tambien puedes poner la ruta completa al fichero filtro.txt:

findstr /v /i /g:"c:\mis_filtros\filtro.txt" doc.txt


Título: Re: ayuda con pequeño script
Publicado por: ramos_45 en 29 Septiembre 2018, 12:31 pm
Creo que ya está, probé en otro pc y si que funcionó. Gracias