2 votos

¿Difunde cada línea individual en el primer archivo contra todas las líneas en el segundo archivo?

Tengo 2 TCL representaciones de un proyecto que obtener generado por 2 versiones diferentes de la misma herramienta, vamos a llamarlos v1.tcl y v2.tcl

Estos registros son normalmente lógicamente idéntica para todos los intentos y propósitos, con la excepción de la orden de las líneas. Cada línea en v1.tcl se encuentra en algún lugar exactamente una vez en v2.tcl cuando las versiones 1 y 2 de mi proyecto son idénticos.

Me gustaría ser capaz de identificar si alguien ha hecho un cambio en v2.tcl que necesita ser adaptado a v1.tcl (o viceversa) ... en otras palabras me gustaría ver sólo las líneas que no coinciden. Por ejemplo:

  1. v1.tcl:

    foo1
    bar1
    hello1
    world1
    
  2. v2.tcl:

    hello1
    bar1
    foo2
    world1
    goodbye2
    
  3. "diff" valor de retorno:

    file1:1 foo1
    file2:3 foo2
    file2:5 goodbye2
    

Debo escribir mi propio pequeño script? Hay una herramienta que ya lo hace?

5voto

Xen2050 Puntos 2860

Si las líneas son idénticas, y sólo quiero saber si hay más líneas en un archivo o en otro, podría utilizar ordenar & diff (y el Proceso de Sustitución de aquí):

$ diff -B <(sort v1.tcl) <(sort v2.tcl)
2c2,3
< foo1
---
> foo2
> goodbye2

Con diff -B a ignorar las líneas en blanco. Usted podría utilizar grep -n [pattern] file encontrar la línea que el patrón está en (tal vez con uno o una combinación de grep, cut, sed, awk), si lo que importa.

He aquí una respuesta más completa, mostrando el archivo y número de línea que contenga los partidos. No usar sed o awk, sólo bash, corte, grep... aquí está todo (esencialmente) en una línea:

diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line; do if \
echo "$line" | grep -q "^<"; then grep -F -n -H \
"$(echo "$line"|cut -c3-)" v1.tcl ; elif echo "$line" | grep -q \
"^>"; then grep -F -n -H "$(echo "$line"|cut -c3-)" v2.tcl ; fi done

O dividido en varias líneas:

diff -B <(sort v1.tcl) <(sort v2.tcl) | while read -r line
do
  if echo "$line" | grep -q "^<"
    then grep -F -n -H "$(echo "$line"|cut -c3-)" v1.tcl
  elif echo "$line" | grep -q "^>"
    then grep -F -n -H  "$(echo "$line"|cut -c3-)" v2.tcl
  fi
done

Y dependiendo de los archivos de entrada (especialmente si usted tiene líneas con barras diagonales inversas), estoy usando estas opciones para leer y grep:

  • read -r no permitir que las barras invertidas para escapar caracteres
  • grep -F Interpretar el PATRÓN como una lista de cadenas fijas (en lugar de expresiones regulares), separadas por saltos de línea, cualquiera de los cuales se asociarán

Además, el uso de Pimp Juice ES los comentarios, si los hay barras diagonales inversas a las líneas de los archivos de entrada grep da el "archivo:línea de barra diagonal inversa de error". El uso de la -F opción para grep para desactivar la barra diagonal inversa resultados de error en una parte mucho más pequeña grep-la única solución:

grep -FvHn -f v2.tcl v1.tcl ;grep -FvHn -f v1.tcl v2.tcl

grep las opciones que se utilizan:

  • -f Obtener patrones de ARCHIVO, uno por línea.
  • -F Interpretar el PATRÓN como una lista de cadenas fijas (en lugar de expresiones regulares), separadas por saltos de línea, cualquiera de los cuales se asociarán
  • -v Invertir el sentido de la coincidencia, seleccione la no-coincidencia de líneas.
  • -H Imprimir el nombre de archivo para cada partido
  • -n Prefijo de cada línea de salida con la base 1 número de línea dentro de su archivo de entrada.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: