Comparando arquivos no awk / bash

0

Eu me deparei com um problema e não tenho idéia de como encontrar a solução OPTIMAL. Eu tenho uma lista de arquivos que se parece com isso:

file1
file1%pre%file2%pre%...fileX%pre%%pre%file(x+1)%pre%
file2%pre%...fileX%pre%%pre%file(x+1)%pre%

Todo nome de arquivo é separado por | while read -r -d $'%code%' file e cada grupo de arquivos é separado por um %code% extra. Cada arquivo de cada grupo tem os mesmos códigos hash (usei o md5sum para calculá-los). Preciso encontrar quais arquivos de cada grupo são iguais e imprimi-los.

Por exemplo, eu tenho um grupo de 6 arquivos (vamos chamá-los f1, f2, f3, f4, f5, f6). Eu usei diff e descobri que f1, f2, f3 são os mesmos e f4, f5 também são os mesmos (mas diferentes de f1, f2, f3). Então, eu quero imprimir os arquivos f1, f2, f3 e f4, f5, mas não f6 (porque não encontrei o duplicado de f6).

Eu uso %code% para ler dados. Vocês podem me ajudar a encontrar a melhor maneira de fazer isso?

Editar: para simplificar o meu problema. Eu tenho uma matriz que tem n campos. Eu estou procurando fácil de implementar no bash e não o algoritmo mais lento que vai encontrar valores que são os mesmos e no final desses valores adicionar algum número, o que ajudará a classificá-lo mais tarde. Referindo-se ao meu exemplo, depois de 'classificação' eu quero imprimir 'f1 1', 'f2 1', 'f3 1', 'f4 2', 'f5 2', 'f6 3' então usando awk eu vou modificá-lo mesa.

    
por ogarogar 07.11.2016 / 21:13

1 resposta

0

Considerando que você deve usar o MD5, e seus arquivos de entrada são conhecidos como hash collisions (igual a MD5 somas para arquivos binários diferentes), um truque que você pode usar é usar um SALT aleatório (uma string aleatória curta) eles, para fazer os checksums colidirem novamente.

Por exemplo,

#!/bin/bash
SALT=$(dd if=/dev/urandom status=none bs=1c count=128)

FILES=("f1" "f2" "f3" "f4" "f5");
for file in "${FILES[@]}"
do
     echo $(echo $SALT | cat - "$file" | md5sum --binary | cut -d' ' -f1) $file
done

Isso calculará um hash MD5 para cada arquivo em FILES , adicionando um SALT de 128 bytes gerado aleatoriamente na mixagem, resultando em uma saída assim:

741eefc6c14d80ee38164a0961cfd200 f1
741eefc6c14d80ee38164a0961cfd200 f2
741eefc6c14d80ee38164a0961cfd200 f3
68441eb38393a75dee94ae089d528633 f4
68441eb38393a75dee94ae089d528633 f5

Se você executar isso novamente, receberá as diferentes somas de verificação (pois SALT será diferente), mas, no entanto, elas corresponderão aos arquivos duplicados:

bc2fdca1b765989b62e507711749c5b4 f1
bc2fdca1b765989b62e507711749c5b4 f2
bc2fdca1b765989b62e507711749c5b4 f3
a31019a6ace1f51b18920bb33d781c97 f4
a31019a6ace1f51b18920bb33d781c97 f5

Agora você pode simplesmente processar esta lista "MD5SUM file", para obter a lista de duplicatas.

E você também terá que adaptar isso para lidar com os dados de entrada em seu formato - vários \ 0 \ 0 grupos separados de, \ 0 nomes de arquivos separados. (Não vai tirar toda a diversão da sua tarefa).

    
por 08.11.2016 / 08:49