Ms-Dos - extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

<<>>
 
Vista:
Imágen de perfil de Daniel

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Daniel (5 intervenciones) el 28/04/2025 20:12:28
Hola gente, buenas tardes... acá en Buenos Aires.

Quiero extraer de un archivo de texto todas las lineas (o registros) con un dato determinado mas las 5 lineas subsiguientes a la encontrada en un nuevo archivo.

Por ejemplo: la linea a encontrar podría contener el texto "AABBCC12" (nombre de uno de los varios reportes dentro del txt y que se repiten dentro del mismo) dato que no se repite en las 5 lineas siguientes.

Ya estuve buscando en la web y en este foro... también peleándome combinando FOR y FINDSTR...
y no le encuentro la vuelta...

Desde ya muchas gracias a quien me ayude o guie en encontrar la solución.

Mientras seguiré dándole batalla... y si gano lo publicaré en el foro...

Saludos, Daniel
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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Marco (2 intervenciones) el 28/04/2025 20:48:11
Hola, sino has podido con los comandos existentes, la única manera de resolver esto es crear un comando personalizado en algún lenguaje compilador (c, c++, pascal, etc). O sino crear un pequeño programa que realice tal tarea.
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 Daniel

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Daniel (5 intervenciones) el 28/04/2025 21:07:32
gracias... en algo asi pense... pero desafortunadamente en la empresa que trabajo no me esta permitido hacerlo con "C" o similar... no estoy en el sector de sistemas... y quienes podrian hacerlo "no tienen tiempo"... ja
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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Rolando José (6 intervenciones) el 28/04/2025 22:35:14
para mi lo mas facil sin progamar seria usando las herramientas que traer un software llamado busybox.https://busybox.net/

busybox es un compandio de utilidades consola que trae por defecto los Sistemas Unix, y al ser Linux de codigo abierto, loimplementaron para para Windows mas o menos desde 2015.

en Unix cat muestra en la consola un archivo no binario como puede ser un archivo de texto.
mediante tuberias "|" una tuberia permite enlazar la salida de un comando con el inicio de otro.

y se puede hacer mostrar el archivo -->filtrar la cadena "AABBCC" y esa información es la que se mostraria en pantalla.

luego con busibox sobre Windows eeria tanto como abrir la consola cmd, y ejecutar el comando:
busybox cat archivo.txt | busybox grep "AABBCC12"
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 Daniel

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Daniel (5 intervenciones) el 28/04/2025 23:56:09
ok Rolando, muchas gracias. lo probare para ver que surge.
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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por César Augusto Navarro Gómez (4 intervenciones) el 29/04/2025 00:23:10
Hola Daniel.

Agregando a la solución ya mencionada, yo uso MobaXTerm en su modo portable, ya trae BusyBox como parte de su core y ahí puedes ejecutar el comando grep que te mencionan, solo cámbialo un poco:

egrep -A 5 "AABBCC12" archivo.txt

El comando egrep es la evolución de grep, y su opción -A te mostrará el número de líneas especificado que se encuentren después de la coincidencia (la A es de After)
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 Daniel

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Daniel (5 intervenciones) el 29/04/2025 00:44:42
gracias Cesar, lo descargare y probare
mientra seguire intentado con batchs... q es lo mas factible de no ser rechazado por la empresa
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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Marco (2 intervenciones) el 29/04/2025 21:24:01
Solo por curiosidad, porque rechaza la empresa soluciones de código compilado (se puede crear un comando D.O.S. "busca_archivo" con dos parámetros 'archivo' y 'texto_buscado'), el código fuente lo tendrían ustedes y por lo tanto no hay temor de que tenga algún código malicioso el programa.
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 Daniel

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Daniel (5 intervenciones) el 29/04/2025 23:54:28
ojala supiera como generar ese comando, mis conocimientos (antiguos) no me permiten hacerlo.
entiendo q es posible hacerlo pero no se como, trabajamos con batch, access y excel...
... unicas herramientas q tenemos disponibles en nuestro sector
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: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Antoni Masana (814 intervenciones) el 19/05/2025 23:25:06
Buenas Daniel.

Tengo un buen dominio de los BAT. Te puedo intentar hacer un proceso pero necesito uno o varios ficheros de ejemplo.

Hay otras herramientas que podrías utilizar, una de ellas es el PYTHON, no necesita compilar y es gratuito.

Otra es un comando de Linux que le llama AWK, existe su versión en Windows, funciona como un comando de MSDOS o ventana de CMD.
Es una herramienta para gestionar ficheros de texto y bastante fácil de programar, se escribe los comando en un fichero de texto que se le pasa como parámetro.
Si se sabe programar en C ayuda bastante.

Alguno ejemplo simples:

1
2
3
4
5
6
7
8
9
10
11
12
13
awk -F ':' '{print $1}' archivo.txt
 
awk -F '|' '{print $2, $4}' archivo.txt
 
awk 'BEGIN {FS = ":"} {print $1, $3}' archivo.txt
 
awk -F ':' 'BEGIN {OFS = "|"} {print $1, $3}' archivo.txt
 
awk -F '/' '{print $NF}' archivo.txt
 
awk -F '/' '{print $(NF-1)}' archivo.txt
 
awk '/patrón/ {print}' archivo.txt

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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Rolando José (6 intervenciones) el 21/05/2025 18:20:50
Siento diferir en esto,
Porque te considero Senior en BAT y en MS-DOS Antoni, yo solo se tcltk, pero no se en cual version de cmd venia el awk, yo tuve que instalar busybox presisamente porque no estaba ese comando dentro del cmd de win7,win10 o win11.

En cambio en busybox encontre los siguientes que son muy utiles para quien sabe usar la consola de linux como es mi caso:
[ [[ alias break cd chdir command continue echo eval exec
exit export false getopts hash help history jobs kill let local
printf pwd read readonly return set shift source test times trap
true type ulimit umask unalias unset wait [ [[ ar arch ascii
ash awk base32 base64 basename bash bc bunzip2 busybox bzcat
bzip2 cal cat cdrop chattr chmod cksum clear cmp comm cp cpio
crc32 cut date dc dd df diff dirname dos2unix dpkg dpkg-deb drop
du echo ed egrep env expand expr factor false fgrep find fold
free fsync ftpget ftpput getopt grep groups gunzip gzip hd head
hexdump httpd iconv id inotifyd install ipcalc jn kill killall
lash less link ln logname ls lsattr lzcat lzma lzop lzopcat make
man md5sum mkdir mktemp mv nc nl nproc od paste patch pdpmake
pdrop pgrep pidof pipe_progress pkill printenv printf ps pwd
readlink realpath reset rev rm rmdir rpm rpm2cpio sed seq sh
sha1sum sha256sum sha3sum sha512sum shred shuf sleep sort split
ssl_client stat strings su sum sync tac tail tar tee test time
timeout touch tr true truncate ts tsort ttysize uname uncompress
unexpand uniq unix2dos unlink unlzma unlzop unxz unzip uptime
usleep uudecode uuencode vi watch wc wget which whoami whois
xargs xxd xz xzcat yes zcat

comandos todos muy utiles si uno no quiere programar o compilar nada.

Auque no se quizas pueda hacer un app de tcltk de menos de 90 lineas que pueda pedir un archivo de entrada y uno de salida, y pida la cadena para filtrar y devuelva el texto filtrado y con lineas siguientes al filtro y guarde en el archivo de salida pero sera programando en tcltk porque no conozco nada mas pequeño que eso y permita filtrar texto.

Ahora que lo pienso podria hacer un html, un unico archivo html+js que con 3 cajones de texto y dos text area abra el archivo y filtre el texto, pero eso es programando, aunque si uno le da el html, solo debera correrlo en un navegador y ya,

Aunque es imposible hacerlo en 90 lineas de codigo como en tcltk, por eso me gusta y lo hago todo en tcltk, porque cuando me piden un .exe, puedo compilarlo con python y aun asi queda pequeño.

CODIGO HTML+JAVASCRIPT 113 LINEAS DE CODIGO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Filtrar Texto</title>
<style>
  body {
    font-family: Arial, sans-serif;
  }
  .container {
    width: 900px;
    margin: 20px auto;
  }
  textarea {
    width: 100%;
    height: 200px;
    margin-bottom: 10px;
    font-family: monospace;
  }
  .controls {
    margin-bottom: 10px;
  }
  button {
    margin-left: 5px;
  }
</style>
</head>
<body>
<div class="container">
  <h2>Filtrar Texto</h2>
 
  <div class="controls">
    <label for="fileInput">Archivo:</label>
    <input type="file" id="fileInput" />
    <label for="filterText">Filtrar por:</label>
    <input type="text" id="filterText" />
    <label for="additionalLines">Líneas Adicionales:</label>
    <input type="number" id="additionalLines" value="0" min="0" />
    <button onclick="processFile()">Filtrar</button>
    <button onclick="saveFiltered()">Guardar filtrado</button>
  </div>
 
  <div>
    <h3>Texto Original:</h3>
    <textarea id="originalText" readonly></textarea>
  </div>
 
  <div>
    <h3>Texto Filtrado:</h3>
    <textarea id="filteredText" readonly></textarea>
  </div>
</div>
 
<script>
  function processFile() {
    const fileInput = document.getElementById('fileInput');
    const filterText = document.getElementById('filterText').value;
    const additionalLines = parseInt(document.getElementById('additionalLines').value, 10);
    const originalTextarea = document.getElementById('originalText');
    const filteredTextarea = document.getElementById('filteredText');
 
    const file = fileInput.files[0];
    if (!file) {
      alert('Por favor, selecciona un archivo.');
      return;
    }
 
    const reader = new FileReader();
    reader.onload = function (e) {
      const content = e.target.result;
      originalTextarea.value = content;
      const filteredContent = filterLines(content, filterText, additionalLines);
      filteredTextarea.value = filteredContent;
    };
    reader.readAsText(file);
  }
 
  function filterLines(content, filter, additionalLines) {
    const lines = content.split('\n');
    let result = [];
    for (let i = 0; i < lines.length; i++) {
      if (lines[i].includes(filter)) {
        result.push(lines[i]);
        for (let j = 1; j <= additionalLines && i + j < lines.length; j++) {
          result.push(lines[i + j]);
        }
      }
    }
    return result.join('\n');
  }
 
  function saveFiltered() {
    const filteredTextarea = document.getElementById('filteredText');
    const textToSave = filteredTextarea.value;
    if (!textToSave) {
      alert('No hay texto filtrado para guardar.');
      return;
    }
    const blob = new Blob([textToSave], { type: 'text/plain;charset=utf-8' });
    const url = URL.createObjectURL(blob);
 
    const a = document.createElement('a');
    a.href = url;
    a.download = 'filtrado.txt';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  }
</script>
</body>
</html>

CODIGO TCLTK INSIDE PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import tkinter as tk
w=tk.Tk()
code='''
proc ahora {{f "%T"}} {return [clock format [clock seconds] -format $f -timezone -0500]}
proc tmsg {{txt ""} {ty "ok"} {img "info"}} {return [tk_messageBox -message $txt -type $ty -icon $img]}
 
catch {destroy .t}
toplevel .t
wm geometry .t "1000x900+0+0"
wm title .t "Filtrar texto con contexto"
wm withdraw .
 
pack [panedwindow .t.p -sashwidth 10 -orient vertical] -side top -fill both -expand 1
 
labelframe .t.p.f -bg #AAA -height 100 -width 800
labelframe .t.p.k -bg #BBB -height 100 -width 800
labelframe .t.p.g -bg #CCC -height 400 -width 800
labelframe .t.p.h -bg #DDD -height 100 -width 800
 
.t.p add .t.p.f -minsize 60
.t.p add .t.p.k -minsize 60
.t.p add .t.p.g -minsize 40
.t.p add .t.p.h -minsize 40
 
# Variables globales
set arch ""
set filtro ""
set ::data ""
 
# Panel archivo
pack [button .t.p.f.ba -text "Archivo:" -command {
    if {![file exists $arch]} {
        set arch [tk_getOpenFile -filetypes {{{TXT} {*.txt}}}]
        if {$arch eq ""} {return}
        set fh [open $arch r]
        set ::data [read $fh]
        close $fh
        .t.p.g.t delete 0.0 end
        .t.p.g.t insert end $::data
    }
}] [entry .t.p.f.ea -textvar arch -width 50] -side left -padx 10
 
# Spinbox para contexto (líneas antes y después)
pack [label .t.p.f.lb -text "Lineas Contiguas (-X a X):"] [spinbox .t.p.f.bsp -from -50 -to 50 -width 5 -textvariable context] -side left -padx 1
set context 0
 
# Panel filtro
pack [button .t.p.k.ba -text "Filtrar por:" -command {
    .t.p.h.t delete 0.0 end
    set lines [split $::data "\n"]
    set total [llength $lines]
    set context [expr {[string trim $context]}]
    array unset mostrar
    for {set i 0} {$i < $total} {incr i} {
        if {[string first $filtro [lindex $lines $i]] >= 0} {
##            for {set j [expr {$i - $context}]} {$j <= [expr {$i + $context}]} {incr j}
            for {set j [expr {$i}]} {$j <= [expr {$i + $context}]} {incr j} {
                if {$j >= 0 && $j < $total} {
                    set mostrar($j) 1
                }
            }
        }
    }
 
    for {set i 0} {$i < $total} {incr i} {
        if {[info exists mostrar($i)]} {
            .t.p.h.t insert end "[lindex $lines $i]\n"
        }
    }
}] [entry .t.p.k.ef -textvar filtro -width 50] -side left -padx 10
# Botón para guardar filtrado
pack [button .t.p.k.bs -text "Guardar filtrado:" -command {
    set sale [tk_getSaveFile -filetypes {{{TXT} {*.txt}} {{LOG} {*.log}}}]
    if {$sale eq ""} {return}
    set fh [open $sale w]
    set ::filtrado [.t.p.h.t get 0.0 end]
    puts $fh $::filtrado
    close $fh
}] -side left -padx 10
# Scrollbars y Text widget para archivo
place [scrollbar .t.p.g.sy -width 20 -command {.t.p.g.t yview}] -x 0 -y 20 -height 400
place [scrollbar .t.p.g.sx -width 20 -command {.t.p.g.t xview} -orient horizontal] -x 20 -y 0 -width 800
place [text .t.p.g.t -undo 1 -font "arial 12" -wrap none -xscrollcommand {.t.p.g.sx set} -yscrollcommand {.t.p.g.sy set}] -x 20 -y 20 -width 860 -height 400
# Scrollbars y Text widget para filtrado
place [scrollbar .t.p.h.sy -width 20 -command {.t.p.h.t yview}] -x 0 -y 20 -height 400
place [scrollbar .t.p.h.sx -width 20 -command {.t.p.h.t xview} -orient horizontal] -x 20 -y 0 -width 800
place [text .t.p.h.t -undo 1 -tabs 50 -font "arial 12" -wrap none -xscrollcommand {.t.p.h.sx set} -yscrollcommand {.t.p.h.sy set}] -x 20 -y 20 -width 860 -height 400
'''
w.eval(code)
w.mainloop()

Este codigo se puede ejecutar en Python incluso en Android, y se puede compilar excepto en Android.
Como Daniel pide que muestre lineas X siguientes al filtrado lo cual hace grep con la opcion -A #, yo le puse a eso como lineas contiguas , para guardar las lineas siguientes a donde aparezca el filtro, como maximo le puse un contexto de 500 lineas, que pueden serivir o no, lo que no quiero es que quede corto.


filtrar_contexto
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: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Antoni Masana (814 intervenciones) el 22/05/2025 20:00:26
El programa AWK que la versión que tengo se llama GAWK.exe no es de Windows, es externo.
Alguien se ha dedicado a crear programas en C que puedan correr en Windows de comandos de Linux.

Seguro que hay otras opciones mucho mejor pero no las conozco todas.

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

extraer todas las lineas/registros, con cierto dato, mas los 5 siguientes de un archivo de texto

Publicado por Rolando José (6 intervenciones) el 27/05/2025 19:48:46
Si es lo mas normal,
mucho antes de "Windows Subsystem for Linux" o de los contenedores y los dokers, existio cygwin, o la version de lindows o el fedora smb que se instalaba en una carpea de windows, o busybox, aplicaciones de linux que compiladas en windows eran mucho mas estables y consumen menos recursos que sus contrapartes de microsoft.

hoy en dia por ejemplo es mejor o mas estable por lo menos necesita la mitad de memoria RAM correr dentro de WSL2 un linux ubuntu y con el ejecutar una emulacion virtual de windows11 por ejemplo con qemu va mas rapido y fluido que correr el mismo win11 sin emulacion.
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