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
file2
contiene 2 líneasA
, ¿necesitafile1
contener 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_2
líneas están contenidas enfile_1
.Del hombre de comunicación:
fuente
-u
opción agregada alsort
comando. Ahora, solo quedan líneas únicas en ambos archivos ordenados.<
canalizado en stdin. ¿El término del soporte cambia esto?file_1
en 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
awk
donde admitelength(array)
funciones específicas (y alguna otraawk
implementación que pueda admitir) y no es necesario si se ordenan los archivos.Esto es leer file2 en una matriz llamada
seen
con 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
awk
implementaciones.Para ignorar líneas vacías / o líneas con espacios en blanco solo si está en el archivo 2 , necesitará agregar
NF
a la condiciónNR==FNR && NF {...
para omitir su lectura en la matriz.fuente
length(array)
es solo gawk AFAIK; definitivamente no es POSIX.Utilizando
comm
puede encontrar líneas que son comunes en ambos archivos.Echa un vistazo
man comm
para más detallesfuente
comm
- compara dos archivos ordenados línea por línea".comm
contiene 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
file1
contiene todas las líneas enfile2
y salir con el estado0
, de lo contrario será algo así como imprimiry salir con estado
1
fuente
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 comoif
owhile
. Ejemplo:fuente
combine
from moreutils le mostrará todas las líneasfile2
que no están enfile1
:Luego puede contar el número de líneas canalizándolas
wc -l
, como:fuente