Filtrando caminhos redundantes de uma lista de caminhos

6

Eu tenho uma lista de caminhos relativos como este:

dir1
dir2
dir2/dir3
dir2/file1
dir3/file2
dir3/dir4
dir3/dir4/file3

No exemplo acima, o especificador dir2/file1 (por exemplo) é redundante, porque a entrada dir2 incluiria esse arquivo.

O que eu quero fazer, essencialmente, é remover caminhos redundantes de uma determinada lista de caminhos. O exemplo acima produziria o seguinte:

dir1
dir2
dir3/file2
dir3/dir4

Observe que os arquivos e diretórios especificados não precisam existir no sistema de arquivos.

Estou disposto a usar qualquer comando comum do Unix (sed, awk, perl, etc.).

    
por Joshua Spence 06.03.2013 / 06:09

2 respostas

0

Ok, vou responder a minha própria pergunta.

Eu fiz meu próprio script awk baseado na solução do @pradeepchhetri.

cat data.txt | sort | awk '
BEGIN{FS=OFS="/";}{
    path=$0;
    for(i=NF;i>0;i--){
        NF--;
        if($0 in paths){next;}
    }
    paths[path]=path;
}
END{for(path in paths){print path;}}' | sort

Que funciona para os meus propósitos.

    
por 07.03.2013 / 01:18
0

Digamos que a lista de caminhos relativos esteja no nome do arquivo "caminho".

Você pode usar o script awk abaixo para imprimir a saída desejada:

 $ awk 'BEGIN{FS="/";} {arr[$1]=$0;count[$1]+=1;} END{for(i in arr){if(count[i]==1){print arr[i]}else{print i}}}' path

Espero que você entenda como isso funciona.

    
por 06.03.2013 / 06:37