首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash中连接和操纵树状结构

在bash中连接和操纵树状结构
EN

Stack Overflow用户
提问于 2015-08-21 16:57:26
回答 2查看 270关注 0票数 2

目前,我有一个命令,它以下列格式输出数据:

代码语言:javascript
运行
复制
apple: banana
apple: cantaloupe
apple: durian
apple: eggplant
banana: cantaloupe
banana: durian
durian: eggplant
eggplant:

换句话说,它是一个树状结构,其中apple是根,它有子bananaeggplantbanana也有子子cantaloupedurianeggplant没有子级,但仍然有一个后缀冒号。

我想将输出连接成以下格式:

代码语言:javascript
运行
复制
apple: banana eggplant
banana: cantaloupe durian
durian: eggplant
eggplant:

有些对象可能在输出中显示不止一次(在本例中,cantaloupedurianeggplant有多个父节点)。虽然这个例子没有它,但也可能有多个根节点(即与apple相同的宽度)。

我将如何修改这个输出?我现在通常使用bash/shell脚本,所以我认为awk可能是最好的处理方法,但是如果用Python、Ruby或其他脚本语言来更好地处理这个问题,我也愿意接受建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-21 17:03:08

您可以使用awk:

代码语言:javascript
运行
复制
awk -F ': *' '{a[$1] = (a[$1]? a[$1] OFS $2 : $2)}
       END { for (i in a) print i ": " a[i] }' file
eggplant:
apple: banana cantaloupe durian eggplant
banana: cantaloupe durian
durian: eggplant

维持原有秩序:

代码语言:javascript
运行
复制
awk -F ': *' '!($1 in a){b[++n]=$1} {a[$1] = (a[$1]? a[$1] OFS $2 : $2)}
   END{for (i=1; i<=n; i++) print b[i] ": " a[b[i]]}' file
apple: banana cantaloupe durian eggplant
banana: cantaloupe durian
durian: eggplant
eggplant:
票数 2
EN

Stack Overflow用户

发布于 2015-08-21 17:04:19

代码语言:javascript
运行
复制
awk -F: '{ list[$1] = list[$1] $2 } END { for (i in list) printf "%s:%s\n", i, list[i] }'

使用awk中的关联数组累积条目,生成列表。awk中的字符串连接有点奇怪。最后,打印出键和键的条目。如果需要订购,你就得这么说。

假设左边的键应该按照输入的LHS第一次出现的顺序输出,那么您可以使用这个稍微复杂的脚本:

代码语言:javascript
运行
复制
awk -F: '{ if (!($1 in list)) keys[++n] = $1; list[$1] = list[$1] $2 }
         END { for (j = 1; j <= n; j++) printf "%s:%s\n", keys[j], list[keys[j]] }'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32145695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档