Linux

如何grep複雜的層次結構?

  • May 22, 2014

我有一個文件:-

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/awknawk)。

雖然它也可以通過以下方式完成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]

引用自:https://unix.stackexchange.com/questions/131289