como ajustar a hierarquia complexa?

3

Eu tenho um arquivo como: -

start apple
1 a
2 b
3 c
start orange
4 a
5 b
start mango
1 a
start a/b/c
5 z
end
4 b
end
6 c
end
start banana
3 c
end
4 d
5 e
end

Eu quero a saída como: -

1 apple/a
2 apple/b
3 apple/c
4 apple/orange/a
5 apple/orange/b
1 apple/orange/mango/a
5 apple/orange/mango/a/b/c/z
4 apple/orange/mango/b
6 apple/orange/c
3 apple/banana/c
4 apple/d
5 apple/e

Eu só quero ajustar a hierarquia dos números com o método mais rápido possível

    
por yogendra singh 21.05.2014 / 11:14

2 respostas

2

Trabalho típico de awk :

awk '$1 == "start" {d[++n] = $2; next}
     $1 == "end" {n--; next}
     {
       printf "%s ", $1
       for(i=1;i<=n;i++) printf "%s/",d[i]
       print $2
     }'

(no Solaris, você pode precisar de /usr/xpg4/bin/awk ou nawk ).

Embora também possa ser feito com sed :

sed '/^start /{s///;x;G;s/\n//;s:$:|:;h;d;}
     /^end/{g;s:[^|]*|$::;h;d;}
     G;s/ \(.*\)\n\(.*\)/ /;y:|:/:'

(aqui assumindo que os caminhos não contêm | caracteres).

    
por 21.05.2014 / 12:04
1

Veja como eu faria isso em python.

O script lê de stdin e imprime em stdout. Também espera que a entrada corresponda a um determinado formato. Se você tem linhas que não correspondem a esse formato, você precisa ajustar o script:

#!/usr/bin/python
import fileinput

hierarchy = []

for line in fileinput.input():
    parts = line.rstrip().split(' ')
    if parts[0] == 'start':
        hierarchy.append(parts[1])
    elif parts[0] == 'end':
        hierarchy.pop()
    else:
        print parts[0] + ' ' + '/'.join(hierarchy)+'/'+ parts[1]
    
por 21.05.2014 / 12:06