![복잡한 계층 구조를 파악하는 방법은 무엇입니까?](https://linux55.com/image/36843/%EB%B3%B5%EC%9E%A1%ED%95%9C%20%EA%B3%84%EC%B8%B5%20%EA%B5%AC%EC%A1%B0%EB%A5%BC%20%ED%8C%8C%EC%95%85%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
파일이 있습니다:-
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
나는 숫자의 계층 구조를 파악하는 가장 빠른 방법을 원합니다.
답변1
일반적인 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:|:/:'
(이는 경로에 |
문자가 없다고 가정합니다.)
답변2
이것이 제가 파이썬에서 하는 방법입니다.
스크립트는 표준 출력을 읽고 stdin
표준 출력으로 인쇄합니다. 또한 입력이 특정 형식과 일치할 것으로 예상합니다. 행이 이 형식과 일치하지 않으면 스크립트를 조정해야 합니다.
#!/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]