使用Unix相当于SQL group_concat()聚合函数?

时间:2016-12-15 01:55:49

标签: unix zsh

在ZSH中,ZLE命令可以有多个键绑定,例如:

▶ bindkey | grep accept-and-hold 
"^[A" accept-and-hold
"^[a" accept-and-hold

如何从bindkey生成一个列表,该列表将给定命令的所有键序列聚合成一行?

使用q的一个解决方案:

▶ bindkey | q "select c2, group_concat(c1) from - group by c2" | grep accept-and-hold 
accept-and-hold ^[A,^[a

但是我想知道是否有办法在不使用perlawksedq等使用更高级的工具的情况下执行此操作

2 个答案:

答案 0 :(得分:0)

救援的一些awk

% bindkey | awk -v zle=accept-and-hold '$2==zle{s=s" "$1};END{print zle s}'
accept-and-hold "^[A" "^[a"

如果你真的想要删除引号:

% bindkey | awk -v zle=accept-and-hold '$2==zle{s=s" "gensub(/\"/,"","g",$1)};END{print zle s}'
accept-and-hold ^[A ^[a

答案 1 :(得分:0)

  

但是我想知道是否有一种方法可以在不使用perlawksedq等更高级的工具的情况下进行操作< / p>

剩余的资源不多...但是我们可以使用关联数组来汇总给定命令(键)的键序列(值):

b=`bindkey`
typeset -A a
setopt EXTENDED_GLOB
eval "${b//(#b)([^$'\n']#) ([^$'\n']#)/a[$match[2]]+=\ $match[1]}"
print -RaC2 ${(kv)a}