как бороться с сложной иерархией?

У меня есть файл: –

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 

Я хочу, чтобы результат был следующим:

 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 

Я просто хочу, чтобы grep иерархию чисел с максимально возможным методом

2 Solutions collect form web for “как бороться с сложной иерархией?”

Типичная работа 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 }' 

(на Solaris вам может понадобиться /usr/xpg4/bin/awk или nawk ).

Хотя это также можно было бы сделать с sed :

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

(здесь предполагается, что пути не содержат | символов).

Вот как я сделал бы это в python.

Сценарий читает из stdin и выводит на stdout. Он также ожидает, что вход соответствует определенному формату. Если у вас есть строки, которые не соответствуют этому формату, вам придется настроить скрипт:

 #!/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] 
  • Как сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10
  • / usr / ucb / cc: языковой пакет дополнительного программного обеспечения не установлен
  • Обнаружение многоходовой машины
  • Какой способ передачи файлов (например, FTP) я могу использовать для rlogin (Solaris 8 на SPARC)
  • Зачем было необходимо перезапустить веб-сервер apache для копирования файлов через php на недавно смонтированный файл?
  • Команда подстановки Stat для захвата разрешений на числовые файлы в Solaris 10
  • временный файл репликации zfs
  • Выделенное выделение CPU для зоны в Solaris 11
  • Можно ли перенести дескрипторы файлов в имена файлов?
  • Как я могу получить полный список процессов в Solaris без усеченных линий?
  • Рекурсивный поиск не работает для grep on solaris
  • Linux и Unix - лучшая ОС в мире.