Linux
如何grep複雜的層次結構?
我有一個文件:-
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
並列印到標準輸出。它還期望輸入匹配某種格式。如果您的行與該格式不匹配,則必須調整腳本:#!/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]