Tengo un archivo grande compuesto por campos de texto separados por punto y coma en forma de una tabla grande. Ha sido ordenado. Tengo un archivo más pequeño compuesto por los mismos campos de texto. En algún momento, alguien concatenó este archivo con otros y luego hizo una ordenación para formar el archivo grande descrito anteriormente. Me gustaría restar las líneas del archivo pequeño del archivo grande (es decir, para cada línea en el archivo pequeño, si existe una cadena coincidente en el archivo grande, elimine esa línea en el archivo grande).
El archivo se ve más o menos así
GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;
etc.
¿Hay una manera rápida y elegante de hacer esto o tengo que usar awk?
fuente
-x
opción, en caso de que una línea en el archivo más pequeño me sucediera una subcadena de otra línea en el archivo principal. Además, es bastante posible que la respuesta de @ UlrichSchwarz sea más rápida.comm
es tu amigo:(
comm
Probablemente tendrá un beneficio de rendimiento,grep
ya que tiene en cuenta la clasificación).Por ejemplo:
fuente
comm -1 -3 file.txt bigfile.txt > newbigfile.txt
comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)