备注2:CentOS 7 docker需要安装
initscripts
,否则 MySQL 无法重启docker exec -it bt bash yum install initscripts
@无名啊,好吧,我太笨了,我陷入了一个误区,就是因为-t删除了换行符,我的想法是想换行展示出来的,直接printf "%s\n"其实就行了🤣🤣
@老虎会游泳,只要 不是病毒就行,我还以为电脑里有隐藏病毒了呢
手机
刷入前需要把控控固件升级到最新版本(1.4.0)
@无名啊,只有这个
https://hu60.cn/q.php/bbs.newtopic.0.html数据量太小,所以不需要辅助索引,直接
select * from 表
然后在内存里进行操作就行了
@老虎会游泳,老虎这么多年,没有啥树形数据要存吗?之前都用的啥方案?
@无名啊,这我了解过一些,之前用while read line发现了<<<这个我多少还知道些,就是后面<<和<含义我不太清楚,一会儿我实践操练去
@庸人,
主要是我其实更习惯用管道这样的方式
不能在匿名管道内修改外部的变量!(如:
jq | readarray
、sum=0; seq 3 | while read -r i; do (( sum += i )); done
)理由
因为这会开启一个子
shell
,然后在子shell
中,readarray
将jq
的输出转成数组。等这一行执行完毕,子
shell
就会退出,刚整理好的数组也随着进程结束而消失了。那用啥?
所以,只能用
<<<
或< <(...)
的形式。
前者需要完全准备好一个字符串,再作为
stdin
喂给所在的命令。我觉得没必要,没这么干(试想,你拷贝一个 1GB 的文件,会申请 1GB 的内存,全部读取完成后,再写入至新文件吗?)
后者,
<(...)
是将...
的stdout
重定向至某个文件(一般是具名管道),然后将此文件作为stdin
喂给所在命令(如果是管道实现,则一般是 4KB 缓冲区)
但是当我单拧出来一个数组,那么结尾就会有一个换行🤣🤣
使用
readarray
时指定-t
参数,会自动删除行末的换行符
@无名啊,我没有回答这些问题所需的知识。如果我真的拿到这样的数据,我只能选择进行实际测试。
@老虎会游泳,那个博主给出新的解决方案了,速度上确实应该会很快,但空间占用也很恐怖。。
更改表结构和建立索引
那个博主新的表结构为:
CREATE TABLE 闭包表 ( 祖先 INT, 后代 INT, 距离 INT, PRIMARY KEY (后代, 距离), KEY (祖先, 距离) );
使得有如下两种索引:
- 聚集索引:
(后代, 距离, 祖先)
- 二级索引:
(祖先, 距离, 后代)
就能高效应对下列查询了:
- (孙)子/后代节点:走二级索引
(✔查询节点, ✔1 或 2 或 任意, ❓<要获取的后代节点>)
- (祖)父/祖先节点:走聚集索引
(✔查询节点, ✔1 或 2 或 任意, ❓<要获取的祖先节点>)
下列查询会小范围扫表,但问题不大:
某后代节点与某祖先节点的距离:走聚集索引
(✔查询后代节点, ❓<要获取的距离>, ❌查询祖先节点)
只要
查询后代节点
层级没有深到离谱,扫表范围也就连续的几行几十行而已。占的空间太大了,怀疑性价比
一个 66W 的 5 级地区表,就要配套一个相当于 780W 的闭包表,快接近 12 倍于主表的辅助表了。。
如此恐怖的空间换时间方案,到底能快多少呢?真的值得投入这么多空间来提速吗?
图2挂了,这里
@无名啊,大佬能不能细说一下你上面的命令,命令不怎么熟有点看不懂,主要是我其实更习惯用管道这样的方式<<这样定向的方式我看不太懂
如上图,我输出所有数组能得到下图这样,当然加了个nl命令
但是当我单拧出来一个数组,那么结尾就会有一个换行🤣🤣
@无名啊,没呢我闲着写的,用的git上的网易云音乐api,想写个实现本地化命令行的一些操作,读取本地json是不想一直都向api请求。哈哈🤣🤣
@庸人,你的需求是要备份当下的网易云歌单吗?还是啥。。
@无名啊,其实就是将name→歌曲名和id又歌曲id放进两个数组变量里🤣。
因为我看jq就是按行输出的,所以想到有没有办法直接放进数组里而不用再去循环遍历一次。后面要用了就直接调用数组了
@庸人,你说下原始需求,感觉会有更好的实现方式
@无名啊,感谢大佬么么,其实我用的就是bash,,只是很不熟,太菜了之前看到过这个不过我在termux终端测试输入没有高亮我以为不支持🤣🤣
@庸人,比如:
$ readarray -td $'\0' arr < <(jq -rj '[.[].name] | join("\u0000")' <<<'[{"id": 1, "name": "a\nb\n"}, {"id": 2, "name": "c\nd"}]') $ declare -p arr declare -a arr=([0]=$'a\nb\n' [1]=$'c\nd')
如果你不担心你的
name
里有换行符的话,可以直接:$ readarray -t arr < <(jq -r '.[].name' <<<'[{"id": 1, "name": "ab"}, {"id": 2, "name": "cd"}]') $ declare -p arr declare -a arr=([0]='ab' [1]='cd')
@庸人,直接回答:可以用
Bash
的readarray
来一次性读到某个数组另外:
Bash Shell
更适合交互式和简单脚本使用。含有数组、字典甚至更复杂数据结构的,可能都值得你考虑换其他语言了- 不想换的话,考虑尽量用
jq
来一次性生成你最终要的数据?
@无名啊,格式就是这样(图下),我主要取出元素playlist下面的所有name元素数组(.playlist[].name),然后有没有办法直接将其结果赋给脚本内变量数组(不想每次都调用),我下图用的循环取出方法,有没有更简单的
。