Difícil jefe de files

Tengo dos files. Un file, sospecho, es un subset del otro. ¿Existe alguna forma de distinguir los files para identificarlos (de manera sucinta) en qué parte del primer file se encuentra el segundo?

diff -e bigger smaller hará el truco, pero requiere alguna interpretación, ya que el resultado es un "script ed válido".

Hice dos files, "más grande" y "más pequeño", donde el contenido de "más pequeño" es idéntico a las líneas 5 a 9 de "más grande" haciendo `diff -e más grande más pequeño 'me consiguió:

 % diff -e bigger smaller 10,15d 1,4d 

Lo que significa "eliminar las líneas 10 a 15 de 'más grande', y luego eliminar las líneas 1 a 4, para get 'más pequeño'". Eso significa que "más pequeño" son las líneas 5 a 9 de "más grande".

Invertir los nombres de los files me dio algo más complicado. Si "más pequeño" realmente constituye un subset de "más grande", solo los commands 'd' (para borrar) aparecerán en la salida.

Puedes hacer esto visualmente con meld . Desafortunadamente, es una herramienta de GUI, pero si solo quieres hacer esto una vez, y en un file relativamente pequeño, debería estar bien:

La image a continuación es la salida de meld ab :

enter image description here

Si los files son lo suficientemente pequeños, puedes sorberlos a ambos en Perl y hacer que su motor regex haga el truco:

 perl -0777e ' open "$FILE1","<","file_1"; open "$FILE2","<","file_2"; $file_1 = <$FILE1>; $file_2 = <$FILE2>; print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not"; print " a subset of file_1\n"; ' 

El -0777 indica a Perl que establezca su separador de logging de input $/ en el valor indefinido para sorber por completo los files.

Si los files son files de text y smaller , dentro de comienzos bigger al comienzo de una línea, no es demasiado difícil implementarlos con awk :

 awk -vi=0 'NR==FNR{l[n++]=$0;next} {if ($0 == l[i]) {if (++i == n) {print FNR-n+1;exit}} else i=0} ' smaller bigger 

Tu pregunta es "Diff head of files". Si realmente quiere decir que un file es la cabeza del otro, entonces un simple cmp le dirá que:

 cmp big_file small_file cmp: EOF on small_file 

Eso le dice que no se detectó una diferencia entre los dos files hasta que se llegó al final del file al leer small_file .

Sin embargo, si usted quiere decir que todo el text de un file pequeño puede ocurrir en cualquier lugar dentro de big_file , entonces suponiendo que pueda colocar ambos files en la memory, puede usar

 perl -le ' use autodie; undef $/; open SMALL, "<", "small_file"; open BIG, "<", "big_file"; $small = <SMALL>; $big = <BIG>; $pos = index $big, $small; print $pos if $pos >= 0; ' 

Esto imprimirá el desplazamiento en big_file donde se encuentra el contenido de small_file (por ejemplo, 0 si small_file coincide al comienzo de big_file ). Si small_file no coincide dentro de big_file , entonces no se imprimirá nada. Si hay un error, el estado de salida será distinto de cero.