我有 mysqldump 的问题,可以通过配置不同的 mysqldump 来解决y,但可能只需通过 shell 脚本管道输出即可解决。
基本上,
mysqldump
始终以相同的顺序输出表,但它以随机顺序列出每个表的所有列(id
除外)。
所以,第一次运行可能会输出这个......
create TABLE `ONE` (
`id` int NOT NULL AUTO_INCREMENT,
`column_a` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_b` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_c` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
create TABLE `TWO` (
`id` int NOT NULL AUTO_INCREMENT,
`column_x` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_y` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_z` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
......第二次运行时,它可能会产生这样的结果:
create TABLE `ONE` (
`id` int NOT NULL AUTO_INCREMENT,
`column_c` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_b` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_a` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
create TABLE `TWO` (
`id` int NOT NULL AUTO_INCREMENT,
`column_y` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_x` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`column_z` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
我想通过 shell 脚本传输结果,该脚本始终以相同的方式对行进行排序。什么脚本可以实现这一点?该脚本需要在 Ubuntu 上运行的构建代理上运行,因此如果可以且实用地使用像
awk
这样的标准 GNU 工具,那么这将优于使用自定义工具。
如何对具有相同缩进级别的相邻行进行排序
我将利用 GNU
AWK
来完成此任务,让 file.txt
内容为
ABLE
CHARLIE
BAKER
123
EASY
DOG
FOX
然后
awk 'BEGIN{PROCINFO["sorted_in"]="@val_str_asc";indent=-1}{match($0,/[^[:space:]]/)}RSTART==indent{arr[NR]=$0;next}{indent=RSTART;for(i in arr){print arr[i]};delete arr;arr[NR]=$0}END{for(i in arr){print arr[i]}}' file.txt
提供输出
ABLE
BAKER
CHARLIE
123
DOG
EASY
FOX
说明:我通知 GNU
AWK
扫描顺序 应该是字符串值,升序并设置为 indent
到 -1
(值从未达到)。对于每一行,我使用 match
字符串函数 通过查找第一个非空白字符的位置来检测缩进大小。如果缩进与之前相同,我只将当前行添加到数组arr
,键为行数,否则我将缩进大小保存在变量indent
中,按预定义顺序从数组输出所有内容,清理数组(因此它变为空)并将当前行添加到数组中。处理完所有行后(END
)我输出数组arr
的内容。
(在 GNU Awk 5.1.0 中测试)