Remove duplicados de nomes básicos em dois arquivos

4

Eu tenho duas longas listas de nomes de arquivos, e quero mesclar esses dois excluindo nomes de arquivos duplicados no sentido de basename. Por exemplo, eu tenho algo parecido com

../data_folderA/file_1 
../data_folderA/file_2
...
../data_folderA/file_n

na lista A e

../data_folderB/file_1 
../data_folderB/file_2
../data_folderC/fffile_1 
../data_folderC/fffile_2
...
../data_folderC/fffile_n

na lista B. Desejo excluir o arquivo duplicado file_1 e o file_2 na lista mesclada. Existe alguma maneira rápida de fazer isso?

    
por pitfall 11.12.2013 / 20:19

2 respostas

4

no awk você poderia fazer

awk -F "/" ' 
     { filenames[$NF]=$0 ; occurence[$NF]++ ; }
 END { for (basename in filenames) 
       {   if (occurence[basename] == 1) 
           {   print filenames[basename]
           }
       }
     } '  listA  listB

Existe, obviamente, uma maneira mais rápida de fazer isso, e eu abuso "{...}", mas espero que esteja claro:

  • primeiro preenchemos uma matriz "filenames []" usando o nome do índice $ NF (= ÚLTIMO campo na linha usando "/" como separador, isto é, o nome da base).

  • E também contamos o número de $ NF que vimos, graças ao array occurence [] (se mais que "1", só temos o mais recente em nomes de arquivo [$ NF], e temos ocorrências [$ NF] > 1)

  • Então, apenas imprimimos aqueles que têm uma ocorrência == 1

por 11.12.2013 / 20:37
0

Supondo que você tenha suas listas em alguns arquivos path/to/list1.txt e /path/to/list2.txt , você pode usar um programa Python simples para adicionar as duas listas em duas listas do Python e, em seguida, configurá-las da seguinte forma:

files1 = [line.strip() for line in open('/path/to/list1.txt')]
files2 = [line.strip() for line in open('/path/to/list2.txt')]

uniqueset = set(files1).union(set(files2))

O uniqueset conterá os arquivos exclusivos. Pode ser que você queira excluir completamente os nomes comuns da lista resultante. Nesse caso, você pode fazer o seguinte:

 uniqueset = set(files1).symmetric_difference(set(files2))
    
por 11.12.2013 / 20:26