我有一个文件:-
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 数字的层次结构
答案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
这是我在 python 中的做法。
该脚本从标准输出读取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]