文本文件——如何对具有相同缩进级别的相邻行进行排序

问题描述 投票:0回答:1

我有 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 工具,那么这将优于使用自定义工具。

shell awk readline
1个回答
0
投票

如何对具有相同缩进级别的相邻行进行排序

我将利用 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 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.