Tengo 2 listas con archivos con sus controles md5sum y las listas tienen diferentes rutas para los mismos archivos.
Ejemplo de contenido en el primer archivo con sumas de verificación (server.list):
2c03ff18a643a1437ec0cf051b8b7b9d /tmp/fastq1_L001_R1_001.fastq.gz c430f587aba1aa9f4fdf69aeb4526621 /tmp/fastq1_L001_R2_001.fastq.gz/ 6e6bcd84f264233cf7c428c0cfdc0c03 tmp/fastq1_L002_R1_001.fastq.gzEjemplo de contenido en dos archivos con sumas de verificación (downloaded.list):
2c03ff18a643a1437ec0cf051b8b7b9d /home/projects/fastq1_L001_R1_001.fastq.gz c430f587aba1aa9f4fdf69aeb4526621 /home/projects/fastq1_L001_R2_001.fastq.gz 6e6bcd84f264233cf7c428c0cfdc0c03 /home/projects/fastq1_L002_R1_001.fastq.gzCuando ejecuto la siguiente línea, obtuve las siguientes líneas:
awk -F"/" 'FNR==NR{filearray[$1]=$NF; next }!($1 in filearray){printf "%s has a different md5sum\n",$NF}' downloaded.list server.list fastq1_L001_R1_001.fastq.gz has a different md5sum fastq1_L001_R2_001.fastq.gz has a different md5sum fastq1_L002_R2_001.fastq.gz has a different md5sum¿Por qué recibo este mensaje si la primera columna es la misma en ambos archivos? Alguien me puede iluminar sobre este tema?
Editar:
Si elimino la ruta y dejo solo el nombre del archivo, funciona bien.
Edición 2:
Como se señaló, existe otra posibilidad de forma de ruta de archivo, que no comienza con / . En este caso, no puedo usar / como separador de campos.
Suposiciones:
Data de muestra:
$ head downloaded.list server.list ==> downloaded.list <== 2c03ff18a643a1437ec0cf051b8b7b9d /home/projects/fastq1_L001_R1_001.fastq.gz # match YYYYf587aba1aa9f4fdf69aeb4526621 /home/projects/fastq1_L001_R5_911.fastq.gz # different md5sum c430f587aba1aa9f4fdf69aeb4526621 /home/projects/fastq1_L001_R2_001.fastq.gz # match MNOPf587aba1aa9f4fdf69aeb4526621 /home/projects/fastq1_L001_R8_abc.fastq.gz # filename does not exist in other file ABCDf587aba1aa9f4fdf69aeb4526621 /home/projects/fastq1_L001_R9_004.fastq.gz # different filename but matching md5sum (vs last line of other file) ==> server.list <== 2c03ff18a643a1437ec0cf051b8b7b9d /tmp/fastq1_L001_R1_001.fastq.gz # match c430f587aba1aa9f4fdf69aeb4526621 /tmp/fastq1_L001_R2_001.fastq.gz # match XXXXf587aba1aa9f4fdf69aeb4526621 /tmp/fastq1_L001_R5_911.fastq.gz # different md5sum TUVWff18a643a1437ec0cf051b8b7b9d /tmp/fastq1_L999_R6_922.fastq.gz # filename does not exist in other file ABCDf587aba1aa9f4fdf69aeb4526621 /tmp/fastq1_L001_R7_933.fastq.gz # different filename but matching md5sum (vs last line of other file) Una idea awk para abordar los problemas de espacios en blanco, así como para verificar las coincidencias de nombres de archivos:
awk ' # stick with default field delimiter of white space but ... { md5sum=$1 n=split($2,arr,"/") # split 2nd field on "/" delimiter fname=arr[n] if (FNR==NR) filearray[fname]=md5sum else { if (fname in filearray && filearray[fname] == $1) next printf "%s has a different md5sum\n",fname } } ' downloaded.list server.listEsto genera:
fastq1_L001_R5_911.fastq.gz has a different md5sum fastq1_L999_R6_922.fastq.gz has a different md5sum fastq1_L001_R7_933.fastq.gz has a different md5sumEl espacio en blanco en $1 utilizado como clave de matriz está causando problemas. Quitándolo:
awk -F"/" '{gsub(/ /, "", $1)}; FNR==NR{filearray[ $1]=$NF; next }!($1 in filearray){printf "%s has a different md5sum\n",$NF}' list1.txt list2.txt