目前,我有一个以下列格式输出数据的命令:
apple: banana
apple: cantaloupe
apple: durian
apple: eggplant
banana: cantaloupe
banana: durian
durian: eggplant
eggplant:
换句话说,它是一个树状结构,其中apple
是根,其中包含子banana
和eggplant
,banana
也有子孩cantaloupe
和durian
。 eggplant
没有孩子,但仍然有一个尾随结肠。
我想将输出连接成这种格式:
apple: banana eggplant
banana: cantaloupe durian
durian: eggplant
eggplant:
某些对象可能会在输出中出现多次(在这种情况下,cantaloupe
,durian
和eggplant
有多个父节点。虽然这个例子没有它,但也可能有多个根节点(即与apple
相同的广度)。
我将如何修改此输出?我现在一般都在使用bash / shell脚本,所以我认为awk
可能是解决这个问题的最佳方法,但是如果在Python,Ruby,Perl或其他方面更好地处理它脚本语言,我也愿意接受建议。
答案 0 :(得分:2)
您可以使用awk:
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
维持原始订单:
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:
答案 1 :(得分:2)
awk
使用awk
中的关联数组累积条目,构建列表。 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]] }'
中的字符串连接有点奇怪。最后,打印出密钥和密钥条目。如果需要订购,您需要这样说。
假设左侧的键应按照输入LHS上的首次出现顺序输出,那么您可以使用这个稍微复杂的脚本:
{{1}}