Intereting Posts
Как удалить файловую систему только для чтения с USB-накопителя Разрешение отказа 2ban отказано в скрипте Добавление репозиториев с помощью «./» Утилиты VMWare останавливаются Работа над dist-upgrade универсальная помощь / команда man: помощь встроенных частичных совпадений пытаясь установить пакет chef-client через локальный репозиторий yum Установите pacman на работающую ОС, чтобы исправить панику ядра, вызванную обновлением пакета Отображать малину Pi над linux CD в ​​каталог из HISTORY в сценарии bash или псевдониму, например $ (!!) Независимость от оболочки для строк в скриптах Что эквивалентно `type` (используется в bash и sh) в csh? количество сеансов ssh, разрешенных с сервера Установка каталога samba изменяет все права доступа к файлам для пользователя, который его монтировал Fedora 17: Не удается открыть файл шрифта True cd в последний буквенно-цифровой каталог

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

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

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 иерархию чисел с максимально возможным методом

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