📄 hierarchy
字号:
#!/usr/local/bin/gawk -f#**************************************************************************************## hierarchy:# This program takes an input file which defines a DAG# and expands it into a tree. It is useful when you have a tree of# generic types. See the sample input file "file_types.hierarchy"# for a sample dataset, and sample outputs "file_types.includes.h",# "file_types.operation.h" and "file_types.type.h". The input has # three distinct types of input lines:## root TYPE# set <TAG> TYPE1 TYPE2 ...# children TYPE|<TAG> TYPE|<TAG> TYPE|<TAG> ...## each word is tab-separated. "root" defines the root type of the # tree. "set" defines an alias for a list of types. "children"# defines the child types (or sets of types) for a given type or # set of types.##**************************************************************************************# command line switches:# -voutput_type=type -- print the specialized type definition (iPcress only)# -voutput_type=general -- general output type. has sub-options# -vpreamble=??? -- print this ??? string before the type# -vpostamble=??? -- print this ??? string after after the type# -vprint_first=1 -- if you want to include the root type###**************************************************************************************function print_type_node (queue, node, out, i) { for (i = 1 ; i <= queue[node] ; i ++) printf "%s", queue[node,i] ; printf "_type = \n\t" ; for (i = 1 ; i <= queue[node] ; i ++) { printf "isa_%s", queue[node,i] ; if (i < queue[node]) printf " | " ; } printf ",\n" ; return}function print_general_node (queue, node, i) { if ((queue[node] > 1) || (print_first == 1)) { printf "%s", preamble; for (i = 1 ; i <= queue[node] ; i ++) { if ((i == queue[node]) && (i > 1)) printf "."; printf "%s", queue[node,i] ; } printf "%s\n", postamble; } return}BEGIN { head = 2; tail = 1; }$1 == "set" { set_names[$2] = NF - 2; for (dummy = 3 ; dummy <= NF ; dummy ++) { set_names[$2,dummy - 2] = $dummy; } }$1 == "root" { root_set = $2 ; }($1 == "children") && ($2 ~ /<.+>/) { for (s_el = 1 ; s_el <= set_names[$2] ; s_el ++) { t=0 ; for (dummy = 3 ; dummy <= NF ; dummy ++) if ($dummy ~ /<.+>/) { for (i = 1 ; i <= set_names[$dummy] ; i ++) { t++ children[set_names[$2,s_el],t] = set_names[$dummy,i] } } else { t ++ children[set_names[$2,s_el],t] = $dummy; } children[set_names[$2,s_el]] = t; } }($1 == "children") && ($2 !~ /<.+>/) { t = 0; for (dummy = 3 ; dummy <= NF ; dummy ++) if ($dummy ~ /<.+>/) { for (i = 1 ; i <= set_names[$dummy] ; i ++) { t++ children[$2,t] = set_names[$dummy,i] } } else { t ++ children[$2,t] = $dummy; } children[$2] = t; }END { queue[1] = 1; queue[1,1] = root_set; while (head > tail) { if (output_type == "type") print_type_node(queue,tail); if (output_type == "general") print_general_node(queue,tail); for (i = 1 ; i <= children[queue[tail,queue[tail]]] ; i ++) { # add new node to queue for (j = 1 ; j <= queue[tail] ; j ++) queue[head,j] = queue[tail,j]; queue[head] = queue[tail] + 1; queue[head,queue[head]] = children[queue[tail,queue[tail]],i] head ++ } tail ++ } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -