Estoy tratando de encontrar una manera de determinar si un archivo de texto es un subconjunto de otro ...
Por ejemplo:
foo
bar
es un subconjunto de
foo
bar
pluto
Mientras:
foo
pluto
y
foo
bar
no son un subconjunto el uno del otro ...
¿Hay alguna manera de hacer esto con un comando?
Esta verificación debe ser una verificación cruzada y debe devolver:
file1 subset of file2 : True
file2 subset of file1 : True
otherwise : False
Respuestas:
Si se llama a esos contenidos de archivo
file1
,file2
yfile3
en orden de aparición, puede hacerlo con el siguiente one-liner:fuente
in
operador de Python .Con
perl
:-0octal
define el delimitador de registro. Cuando ese número octal es mayor que 0377 (el valor de byte máximo), eso significa que no hay delimitador, es equivalente a hacerlo$/ = undef
. En ese caso,<>
devuelve el contenido completo de un solo archivo, ese es el modo slurp .Una vez que tenemos el contenido de los archivos en dos
$h
y$n
variables, podemos usarindex()
para determinar si uno se encuentra en el otro.Sin embargo, eso significa que todos los archivos se almacenan en la memoria, lo que significa que el método no funcionará para archivos muy grandes.
Para archivos mmappables (generalmente incluye archivos normales y la mayoría de los archivos buscables, como dispositivos de bloque), se puede solucionar usando
mmap()
los archivos, como con elSys::Mmap
módulo perl:fuente
Encontré una solución gracias a esta pregunta
Básicamente estoy probando dos archivos
a.txt
yb.txt
con este script:Si uno es subconjunto del otro el retorno de la escritura
0
deTrue
otra manera1
.fuente
%L
hace tres años. Deman diff
(versión actual)%L
significa "contenido de la línea".Si f1 es un subconjunto de f2, entonces f1 - f2 es un conjunto vacío. Partiendo de eso, podemos escribir una función is_subset y una función derivada de ella. Según la diferencia establecida entre 2 archivos de texto
fuente
#!/bin/bash
?De http://www.catonmat.net/blog/set-operations-in-unix-shell/ :
fuente