Haré mi pregunta con un ejemplo. Tengo 2 archivos:
Archivo n. ° 1:
118D FC300_R5_TP FX.B 32775 2112 6 2038 6 2112 0
118E FC300_R5_TP FX.B 32775 2136 7 2065 6 2136 0
118F FC300_R5_TP FX.B 32775 2124 6 2064 6 2124 0
1190 FC300_R5_TP FX.B 819210 814632 99 814609 99 814632 0
1191 FC300_R5_TP FX.B 819210 104100 13 103714 13 104100 0
1192 FC300_R5_TP FX.B 1638420 1609476 98 1609402 98 1609476 0
1196 FC300_R5_TP FX.B 1638420 1638432 100 1638379 100 1638432 0
119A FC300_R5_TP FX.B 3276840 3271776 100 3271698 100 3271776 0
119E FC300_R5_TP FX.B 3276840 3264120 100 3264034 100 3264120 0
11A2 FC300_R5_TP FX.B 3276840 2328648 71 2328546 71 2328648 0
11A6 FC300_R5_TP FX.B 3276840 2328444 71 2328355 71 2328444 0
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
Archivo # 2:
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Salida deseada
Archivo # 3:
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Me gustaría comparar el archivo 1 y el archivo 2 usando sus primeras columnas y eliminar toda la línea o fila del archivo 2 donde coinciden en el archivo 1. También me gustaría guardar los resultados en un tercer archivo, archivo # 3.
fuente
Informaría las líneas que solo están en
f2
.Informaría las líneas de
f2
cuyo primer campo no se encuentra como el primer campo en cualquier línea def1
.(necesita un shell con soporte para la sustitución de procesos como
ksh93
,zsh
obash
).fuente
Solo por diversión, aquí hay una solución en Perl:
Ejemplo
Detalles
La solución Perl anterior se compone de 2 bucles. El primer bucle lee todas las líneas desde
file1
y crea un hash,%names
donde se agrega cada columna que identificamos.El segundo
while
ciclo luego se ejecuta sobre el segundo archivo,file2
y la columna 1 de cada línea se identifica usando la expresión regular:Lo anterior dice desde el principio de la línea, hacer coincidir todo lo que no sea un espacio y guardarlo en la variable temporal
$1
. Se guarda envolviendo los parens a su alrededor. El.*
dice que coincida con todo lo demás en la línea.El siguiente bit de esas líneas dice que busque el bit de columna 1 que acabamos de guardar
$1
en el%names
hash:Si está presente allí, entonces no queremos imprimirlo. Si no está allí, imprímalo.
fuente
Método 1 # Bash
Método 2 # Solo Grep
grep funciona, pero no es garantía
fuente
Vamos a obtenerlo como
Archivo n. ° 1: archivo1.txt
Archivo n. ° 2: file2.txt
Luego corre siguiendo en la terminal
output.txt contendrá los resultados deseados.
Explicación:
fuente