quarta-feira, 26 de junho de 2013

Comparando 2 arquivos de textos e procurando nomes repetidos

Para desenvolver um software é necessário desenvolver ferramentas de testes e assim, mais softwares são desenvolvidos.

Ao executar o comando find procurando arquivos *.JPG e *.jpg, obtém-se como resposta 633 arquivos.

O problema era o fato do software informar 579 arquivos de imagens. A diferença é 54 unidades.

O primeiro passo é comparar as duas listagens de arquivos e entender o que torna o conteúdo distinto. Como o pen-drive é do tipo VFAT, não tinha permissão para executar scripts, então a solução foi usar a linha de comando e direcionar a saída para um arquivo:

$ ls -R | grep '\./' | cut -c 3- | sed 's/://g' > ~/programas/arq2.txt

Em seguida foi feita uma ordenação no arquivo arq2.txt que a saída foi para arq633.txt:

$ cat arq2.txt | sort > arq633.txt

O arquivo arq633.txt contém 633 linhas e cada uma delas o nome do arquivo *.jpg ou *.JPG

O arquivo com as 579 linhas foi gerado pelo software que estou desenvolvendo. É preciso usar o editor vim para eliminar colunas como data, tamanho do arquivo etc.

O script que levanta quais são os arquivos que diferem está abaixo.

#!/bin/bash

ls repeated_files.txt > /dev/null
if [ $? = 0 ]
  then
    rm repeated_files.txt
fi

for i in `seq 633`
  do
    arq633=`head -n $i arq633.txt | tail -n 1`
    freq=`grep "$arq633" arq633.txt | wc -l | awk '{printf "%s\n",$1}'`
    if [ $freq != 1 ]
      then
        grep ^"$arq633" arq633.txt >> repeated_files.txt
    fi
  done

cat repeated_files.txt | sort | uniq

Comento sobre a linha

grep ^"$arq633" arq633.txt >> repeated_files.txt

Sem o circunflexo (^) não há distinção para a ocorrência

1.jpg
baixa11.jpg
baixa1.jpg
CIMG3701.jpg
CIMG3711.jpg
CIMG3751.jpg
CIMG4531.jpg

porque o grep encontra "1.jpg" em todos os arquivos.

Executando o script obtém-se a seguinte saída:

1.jpg
DSC07857.JPG
DSC07858.JPG
DSC07859.JPG
DSC07861.JPG
DSC07862.JPG
DSC07863.JPG
DSC07864.JPG
DSC07865.JPG
DSC07866.JPG
DSC07867.JPG
DSC07868.JPG
DSC07869.JPG
DSC07870.JPG
DSC07871.JPG
DSC07872.JPG
DSC07873.JPG
DSC07874.JPG
DSC07875.JPG
DSC07876.JPG
DSC07877.JPG
DSC07878.JPG
DSC07879.JPG
DSC07880.JPG
DSC07881.JPG
DSC07882.JPG
DSC07883.JPG
DSC07884.JPG
DSC07885.JPG
DSC07886.JPG
DSC07887.JPG
DSC07888.JPG
DSC07889.JPG
DSC07890.JPG
DSC07891.JPG
DSC07892.JPG
DSC07893.JPG
DSC07894.JPG
DSC07895.JPG
DSC07896.JPG
DSC07897.JPG
DSC07898.JPG
DSC07899.JPG
DSC07900.JPG
DSC07901.JPG
DSC07902.JPG
DSC07903.JPG
DSC07904.JPG
DSC07905.JPG
DSC07906.JPG
DSC07907.JPG
DSC07908.JPG
DSC07909.JPG
DSC07910.JPG

Que são 54 arquivos JPG.

Conclusão: O software processa 633 imagens, mas como há nomes repetidos, 54 são sobreescritos mostrando 579 arquivos JPG/jpg.

Caso encerrado!