Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

168
Vistas
Compare dos archivos y almacene las diferencias usando condicional

Logré encontrar la mitad de la solución a mi desafío, pero no puedo encontrar la manera de agregar un condicional para tratar con la otra mitad. Estoy usando awk . El separador de campos es ; y los valores están entre comillas dobles " . Los archivos tienen solo 3x campos cada uno.

Tengo dos archivos (file1.txt file2.txt) y quiero almacenar las diferencias en un tercer archivo (results.txt).

archivo1.txt

 "SWITCH1";"rack7";"Datacenter1" "SWTICH46";"rack1";"rack1" "ROUTER3";"";"rack1" "SWITCH7";"rack1";"rack1" "ROUTER9";"rack1";"rack1" "ROUTER22";"rack1";"Datacenter4"

archivo2.txt

 "SWITCH1";"rack7";"Datacenter1" "ROUTER22";";"Datacenter4" "SWITCH51";"rack7";"Datacenter2"

Si uso:

 awk -F';' 'FNR==NR {a[$0];next} !($0 in a)' file1.txt file2.txt

Yo obtengo:

 "ROUTER22";";"Datacenter4" "SWITCH51";"rack7";"Datacenter2"

Pero quiero tratar $2 en file2.txt " y $2 en file1.txt rack1 no como una diferencia entre archivos. Por lo tanto, cada vez que encuentro una entrada en file2.txt que tiene " en el campo $2 y rack1 en el campo $2 en file1.txt por el mismo $1, no quiero tratarlo como diferencia y descartarlo.

El archivo se genera dinámicamente cada noche y cuando sucede; field $2==rack1 en file1.txt mientras que field $2==" en file2.txt . Esta es la coincidencia para excluir, así como la que logré excluir con el comando awk anterior. A continuación se muestra el resultado esperado:

Resultados deseados.txt

 "SWITCH51";"rack7";"Datacenter2"

Estoy luchando por encontrar un condicional para manejar este escenario.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puede verificar si el valor del campo 2 es solo " y reemplazarlo con "rack1"

Si después del reemplazo, $0 no está en la matriz a , imprima la fila sin modificar, que es la variable tmp en el ejemplo.

 awk ' BEGIN{FS=OFS=";"} FNR==NR {a[$0];next} { tmp = $0 sub(/^"$/, "\"rack1\"", $2) if (!($0 in a)) print tmp } ' file1.txt file2.txt

Producción

 "SWITCH51";"rack7";"Datacenter2"
over 4 years ago · Santiago Trujillo Denunciar

0

Según las muestras mostradas, intente seguir el código awk . La explicación simple sería, en la primera lectura de Input_file, crear 2 matrices a y b con un índice de $ 0 y $ 1, $ 3 respectivamente. En la siguiente lectura de Input_file, verifique 2 condiciones si $ 1, $ 3 NO están presentes en b Y $ 0 no está presente en a, luego imprima esa línea desde Input_file2.

 awk -F';' ' FNR==NR{ a[$0] b[$1,$3] next } !(($1,$3) in b) && !($0 in a) ' file1.txt file2.txt
over 4 years ago · Santiago Trujillo Denunciar

0

Puede almacenar las líneas originales en la matriz a , como lo hace, además de las líneas modificadas donde "rack1" se reemplaza por " :

 $ awk -F';' -vOFS=';' 'FNR==NR {a[$0]; if($2=="\"rack1\"") {$2="\"";a[$0]}; next} !($0 in a)' file1.txt file2.txt "SWITCH51";"rack7";"Datacenter2"

Tenga en cuenta la especificación del separador de campo de salida OFS . Es necesario porque cuando modificamos el campo $2 , awk reconstruye $0 usando OFS , que de forma predeterminada es un espacio, mientras que necesitamos que siga siendo una semicolumna para una comparación correcta al analizar file2.txt .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda