Filtrar entradas en un archivo de texto grande basado en la lista blanca

0

Buen día. Realmente podría usar tu ayuda en este caso. Tengo un archivo de texto de estadísticas en el siguiente formato.

 ID=1000000 
 Name=Name1
 Field1=Value1 
 ...(Fields 2 to 25)
 Field26=Value26 

 ID=1000001
 Name=Name2
 Field1=Value1 
 ...(Fields 2 to 25) 
 Field26=Value26

 ID=1000002
 Name=Name2
 Field1=Value1 
 ...(Fields 2 to 25) 
 Field26=Value26 

 ...goes up to 15000

Tengo un archivo de texto de personas activas separado por saltos de línea.

 Name2
 Name5
 Name11
 Name12 
 ...goes up to 1400 Random Names

Necesito poder eliminar registros del archivo de texto de estadísticas (ID, Nombre, Campos 1 a 26) si el nombre no se encuentra en el archivo de texto de personas activas. En el ejemplo anterior, el registro asociado para Nombre1 (ID, Nombre, Campos1 a 26) debe eliminarse ya que no está en el archivo de texto de personas activas.

Intenté reformatear el archivo de estadísticas a través de Notepad ++ usando TextFX-> Quick-> Find / Reemplazar para convertirlo en un archivo separado por comas con cada registro separado por un salto de línea. Lo reorganicé para

 ID       Name    Field1  ...Fields2 to Fields 25... Field26
 1000000  Name1   Value1  ...Value2 to Value 25...   Value26
 1000001  Name2   Value1  ...Value2 to Value 25...   Value26
 1000002  Name3   Value1  ...Value2 to Value 25...   Value26

Lo abrí con Excel y creé dos tablas (tabla de estadísticas y una tabla de nombres activos) en mysql usando el archivo csv. No estoy seguro de cómo procesar esto en una función automática. Además de eliminar registros inactivos, el otro problema que tengo es reescribirlo a su formato anterior.

He estado haciendo todo lo posible para resolver esto durante horas. ¿Hay alguna solución que no requiera que use buscar, copiar, pegar y cambiar entre los dos archivos 1400 veces? Estoy abierto a usar diferentes métodos / programas para simplificar el proceso. Desafortunadamente, tengo que mantener el archivo de estadísticas en este formato.

He golpeado una pared con este. Por favor ayuda. Gracias.

Krispy K
fuente
¿Puedes poner los archivos en 2 tablas de base de datos, preferiblemente una base de datos que puede hacer SELECCIONAR con EXCEPTO? Tal vez pueda mantener el archivo de estadísticas en DB permanentemente si necesita realizar esta tarea con más frecuencia.
ott--

Respuestas:

1

En casi cualquier sistema BSD o Linux (escribí esto en OS X) puede usar el siguiente script bash filter.sh:

#!/bin/bash
if [ ! -f "$1" ] ; then
    echo "First argument must be active users list file"
    exit 1
fi
while read line
do
    if [ "$( grep -E "^$( echo $line | cut -d' ' -f2 )$" "$1" )" ]  ; then
        echo $line
    fi
done

Almacene su lista de usuarios activos originales como active.txty el archivo de estadísticas modificado stats.txtHaga filter.shejecutable usando chmod +x filter.shy ejecútelo:

$ < stats.txt ./filter.sh active.txt | tee result.txt
1000001 Name2 Value1 ...Value2 to Value 25... Value26

Imprimirá las entradas de estadísticas activas en la salida estándar y las escribirá result.txt.

Daniel Beck
fuente
Esperando que el usuario tenga un sistema Linux en alguna parte. No especificó el sistema operativo para la solución deseada.
Daniel Beck
Gracias por responder. Tengo Windows 7 ultimate x64. Usé cygwin para ejecutar el script. $ <stats.txt ./filter.sh active.txt | tee result.txt ./filter.sh: línea 11: error de sintaxis cerca de token inesperado done' ./filter.sh: line 11: hecho 'No sé si ejecutar esto en cygwin es el camino a seguir. ¿También mantendría el formato original? ID = idhere Name = namehere Field1 = valuehere .... Field26 = valuehere Desafortunadamente, tengo que mantener las etiquetas de campo y los signos de igual. Espero su respuesta.
Krispy K
@KrispyK No tengo idea de cómo hacerlo allí, así que también espero una solución en ese sistema. ¡Buena suerte!
Daniel Beck
Accidentalmente presioné enter mientras editaba mi comentario. ¿Podría comentar sobre la primera respuesta que hice? Gracias.
Krispy K
@KrispyK Pruebe lo siguiente: ./filter.sh active.txt < stats.txt | tee result.txt. Alternativamente, haga clic en el enlace junto a editado debajo de mi publicación y vea la primera versión que sugerí. Los nombres de los archivos estaban codificados en el propio script.
Daniel Beck
0

Editar: interpreté mal la parte sobre csv en la pregunta. Solo estaba tratando de discutir la parte de salida.


Excel no es un paradigma de base de datos / conjunto de registros. En lugar de sobresalir, puede usar Access o excluir tal vez algo como Base de OpenOffice ( http://www.openoffice.org/product/base.html ). Importe los archivos como tablas, vincule las tablas, haga [magia], exporte archivos nuevos.

En Access, una forma loca de generar el archivo es crear una consulta que construya la cadena que desea:

Select
"ID=" & [id] & chr(13) & chr(10) & 
"Name=" & [Name1] & chr(13) & chr(10) & 
( ... )
"Field26=" & [Value26] & chr(13) & chr(10) & 
FROM fooTable

Y luego guárdelo, luego expórtelo a un archivo de texto. Esto creará una consulta con un campo por registro. El 13 + 10 es combo de retorno de carro de Windows + salto de línea.

No es elegante

Horacio
fuente
¿Dónde filtra en función del archivo de usuarios activos? No parece que hayas respondido la pregunta.
Daniel Beck
Estaba respondiendo la segunda parte sobre la salida. Una vez que es un formato de base de datos, uno podría hacer una consulta JOIN; crear un campo de marca que se establece en 1 si su nombre coincide con la lista de nombres activos ( update table1 set flagField = 1 where fooName in (select name from table2)); etc. Tenga en cuenta que almacenar el nombre en esa lista de nombres activos en lugar de su ID (única) es uh oh: ¿cuál de los John Smith es el correcto?
Horacio