Linux/Unix Shell Scripting - comparacion de listas

   
Vista:

comparacion de listas

Publicado por alvaro (1 intervención) el 07/11/2017 13:29:33
22

Buenas, tengo un archivo de 2914 filas y 3 columnas. La primera columna es la que me interesa: es simplemente una cadena de 5 letras.

Por otro lado tengo otro directorio con 5100 archivos '.mat':

puntomat

El nombre de cada archivo '.mat' coincide con la primera columna del otro directorio.
El caso es que hay nombres de archivos de la primera columna del primer directorio, que no están en los 5100 archivos '.mat' (es decir, faltan aún más archivos .mat) del otro directorio, y me gustaría saber cuales son los que NO están (para almacenarlos en una lista) sin tener que ir de 1 en 1 porque sería casi infinito XD.

Os agradecería mucho vuestra ayuda, ¿Cómo puedo hacer esto?.
Muchas gracias!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip

comparacion de listas

Publicado por kip (14 intervenciones) el 07/11/2017 14:54:47
Hola, el primero archivo que contiene tres columnas tiene una separacion entre estas por TAB o tal vez un numero de espacios personalizado como por ejemplo 3 ? Lo pregunto porque podrias obtener la primera columna de aquel archivo con cut algo asi:

1
cut -f 1 archivo1.txt

Esto sabiendo que son tabs los delimitadores, si no lo son puedes colocar el delimitador apropiado, imaginemos que son 3 espacios pordira ser asi:

1
cut -f1 -d '   ' archivo1.txt

Alli coloque como delimitador 3 espacios, ahora bien luego si el otro archivo solo tiene una columna creo que cat es suficiente junto con sed algo asi:

1
cat archivo2.txt | sed -e 's/\..*//'

Al final teniendo los dos datos, podrias usar diff, es lo mas facil que se me ocurre pero tambien puedes usar comm uniq pero la desventaja de estos dos ultimos es que debes ordenar los datos con sort, en fin intenta con diff algo asi:

1
diff <(echo "$(cut -f 1 archivo1.txt)") <(cat archivo2.txt | sed -e 's/\..*//')

El problema de la linea anterior es que te mostrar de una forma extraña las lineas que no sean iguales en ambos archivos, asi que de alguna forma se debe manipular el formato de salida de estos, quizas sirva algo asi:

1
diff --changed-group-format="%<" --unchanged-group-format="" <(echo "$(cut -f 1 archivo1.txt)") <(cat archivo2.txt | sed -e 's/\..*//')

Lo que hago alli es formatear la salida para que me muestre solo las lineas diferentes del archivo1.txt y que no me muestre las que no son diferentes, la verdad es que no se si te funcione, pruebalo y nos cuentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de kip

comparacion de listas

Publicado por kip (14 intervenciones) el 07/11/2017 19:28:56
Me he dado cuenta, gracias a la respuesta de Tom, de que la comparación la debes hacer con una lista de archivos y no con un archivo que contiene los datos *.mat(es lo que crei yo), asi que mi respuesta podria servirte pero modificando esto de aca:

1
<(cat archivo2.txt | sed -e 's/\..*//')

Por

1
<(ls -1 ../folder/ivectors/*.mat | xargs basename | sed -e 's/\..*//')
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

comparacion de listas

Publicado por Tom (304 intervenciones) el 07/11/2017 18:56:28
Habría que probarlo, pero yo no creo que chequear los ficheros uno a uno sea excesivamente lento (gracias al caché de disco y tal).
Algo así podría funcionar:
1
2
3
4
5
cut -f1 MIX06 | while read NAME
do
  TEST="../ivectors/${NAME}.mat"
  [ -f "$TEST" ] || echo $NAME
done > inexistentes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar