Obtuve dos archivos: archivo1 con aproximadamente 10 000 líneas y archivo2 con unos cientos de líneas. Quiero verificar si todas las líneas del archivo2 ocurren en el archivo1. Es decir: ∀ línea ℓ ∈ archivo2: ℓ ∈ archivo1
Si alguien no sabe lo que significan estos símbolos o qué significa "verificar si todas las líneas del archivo2 aparecen en el archivo1" significa: Varias líneas equivalentes en cualquiera de los archivos no influyen en si la verificación devuelve que los archivos cumplen con el requisito o no.
¿Cómo hago esto?
text-processing
UTF-8
fuente
fuente

file2contiene 2 líneasA, ¿necesitafile1contener al menos 2 líneasA?Respuestas:
Este comando generará líneas exclusivas de
file_2. Entonces, si la salida está vacía, entonces todas lasfile_2líneas están contenidas enfile_1.Del hombre de comunicación:
fuente
-uopción agregada alsortcomando. Ahora, solo quedan líneas únicas en ambos archivos ordenados.<canalizado en stdin. ¿El término del soporte cambia esto?file_1en forma clasificada. Ahorra tiempo y mecanografía.Si el número de coincidencias del archivo2 en (las líneas únicas de) archivo1 es el mismo que el número de líneas únicas en el archivo2, entonces todos están allí; de lo contrario, no lo son.
fuente
Usar GNU
awkdonde admitelength(array)funciones específicas (y alguna otraawkimplementación que pueda admitir) y no es necesario si se ordenan los archivos.Esto es leer file2 en una matriz llamada
seencon la clave como la línea completa de file2 .Luego lea el archivo1 y para cada línea si coincide con las líneas en la matriz que se ve, elimine esa clave.
Al final, si la matriz estaba vacía, significa que todas las líneas del archivo 2 existen en el archivo 1 y se imprimirán
Matched, de lo contrario se mostraránNot Matched.Por la compatibilidad en todas las
awkimplementaciones.Para ignorar líneas vacías / o líneas con espacios en blanco solo si está en el archivo 2 , necesitará agregar
NFa la condiciónNR==FNR && NF {...para omitir su lectura en la matriz.fuente
length(array)es solo gawk AFAIK; definitivamente no es POSIX.Utilizando
commpuede encontrar líneas que son comunes en ambos archivos.Echa un vistazo
man commpara más detallesfuente
comm- compara dos archivos ordenados línea por línea".commcontiene una solución que obviamente no es incorrecta. Cuando ejecuto su comando, recibo advertencias de que los archivos no están ordenados y muchas líneas que definitivamente están en ambos archivos.producirá ninguna salida si
file1contiene todas las líneas enfile2y salir con el estado0, de lo contrario será algo así como imprimiry salir con estado
1fuente
Use un programa de Python:
Uso:
El estado de salida del programa indica si todos los patrones del archivo 2 coincidieron:
Para consultar el estado de salida en una cáscara (script) que puede utilizar la
$?variable especial u otras expresiones que evalúan el estado de salida de comandos, por ejemplo, operadores de cortocircuito&&y||y expresiones condicionales comoifowhile. Ejemplo:fuente
combinefrom moreutils le mostrará todas las líneasfile2que no están enfile1:Luego puede contar el número de líneas canalizándolas
wc -l, como:fuente