使用可变文本通过 2 个键对文件中的行进行排序

使用可变文本通过 2 个键对文件中的行进行排序

我是一名 DBA,并且拥有重组生成过程的输出,该输出为我提供了以下格式的 DML:

REORG TABLE SCHEMA.A 一些其他选项
REORG TABLE SCHEMA.B 一些其他选项
REORG TABLE SCHEMA.C 一些其他选项
REORG TABLE SCHEMA.D 一些其他选项
REORG INDEXES ALL FOR TABLE SCHEMA.A 一些其他选项
REORG INDEXES ALL FOR TABLE SCHEMA.B 一些其他选项
REORG INDEXES ALL FOR TABLE SCHEMA.C 一些其他选项
REORG INDEXES ALL FOR TABLE SCHEMA.D 一些其他选项
RUNSTATS ON TABLE SCHEMA.A 一些其他选项
RUNSTATS ON TABLE SCHEMA.B 一些其他选项
RUNSTATS ON TABLE SCHEMA.C 一些其他选项
RUNSTATS ON TABLE SCHEMA.D 一些其他选项

由于我不会进入此处的原因,我需要将此文件按以下顺序排序(请注意,每个表可能少于或多于 4 个表,或者少于或多于 3 个条目):

重组表模式.A
表 SCHEMA.A 的全部重组索引
表 SCHEMA.A 上的 RUNSTATS
重组表模式.B
表 SCHEMA.B 的全部重组索引
表 SCHEMA.B 上的 RUNSTATS
...ETC

IE。对文件中的每个表执行 REORG TABLES、REORG INDEX,然后执行 RUNSTAT。

我尝试过以下方法(以及变体):

排序-t。 -k2 测试.fil
排序-t。 -k2.1,2.8 -k1.1,1.7 测试.fil

但问题似乎是让二次排序(REORG TABLE、REORG INDEX 然后 RUNSTAT)正常工作。

上面的第一个排序命令按照表名降序获取对象,然后按 k2 的长度排序。

第二个排序命令没有考虑到字母表中 TABLE 在 INDEX 之后(T 在 I 之后)的事实,但我需要在 Table 之后有 INDEX。

任何可以提供帮助的专家,不胜感激。也许还有其他 awk 和 linux 命令可以结合使用?

我也浏览过排序命令选项,也许有一些我错过了。

答案1

让我们创建一个awk脚本来修改您的数据,以便可以按照您希望的方式轻松对其进行排序:

BEGIN { OFS = "\t" } # set output delimiter to a tab

/REORG TABLE/ { $0 = 1 OFS $0 } # prefix line with 1 for this op.
/REORG INDEX/ { $0 = 2 OFS $0 } # with 2
/RUNSTATS/    { $0 = 3 OFS $0 } # with 3

# prefix line with schema name (unconditionally)
{ match($0,"SCHEMA\.[^ ]*"); $0 = substr($0,RSTART,RLENGTH) OFS $0 }

# output modified line
{ print }

awk脚本将在每行前面添加两个制表符分隔的值:

  1. 架构名称,例如SCHEMA.A
  2. 该模式发生此操作的步骤,是整数 1、2 或 3。

在您的数据上运行它:

$ awk -f script.awk file
SCHEMA.A        1       REORG TABLE SCHEMA.A some other options
SCHEMA.B        1       REORG TABLE SCHEMA.B some other options
SCHEMA.C        1       REORG TABLE SCHEMA.C some other options
SCHEMA.D        1       REORG TABLE SCHEMA.D some other options
SCHEMA.A        2       REORG INDEXES ALL FOR TABLE SCHEMA.A some other options
SCHEMA.B        2       REORG INDEXES ALL FOR TABLE SCHEMA.B some other options
SCHEMA.C        2       REORG INDEXES ALL FOR TABLE SCHEMA.C some other options
SCHEMA.D        2       REORG INDEXES ALL FOR TABLE SCHEMA.D some other options
SCHEMA.A        3       RUNSTATS ON TABLE SCHEMA.A some other options
SCHEMA.B        3       RUNSTATS ON TABLE SCHEMA.B some other options
SCHEMA.C        3       RUNSTATS ON TABLE SCHEMA.C some other options
SCHEMA.D        3       RUNSTATS ON TABLE SCHEMA.D some other options

这样做的目的是使排序键更容易找到sort

然后可以对其进行排序并可以删除新列:

$ awk -f script.awk file | sort | cut -f 3-
REORG TABLE SCHEMA.A some other options
REORG INDEXES ALL FOR TABLE SCHEMA.A some other options
RUNSTATS ON TABLE SCHEMA.A some other options
REORG TABLE SCHEMA.B some other options
REORG INDEXES ALL FOR TABLE SCHEMA.B some other options
RUNSTATS ON TABLE SCHEMA.B some other options
REORG TABLE SCHEMA.C some other options
REORG INDEXES ALL FOR TABLE SCHEMA.C some other options
RUNSTATS ON TABLE SCHEMA.C some other options
REORG TABLE SCHEMA.D some other options
REORG INDEXES ALL FOR TABLE SCHEMA.D some other options
RUNSTATS ON TABLE SCHEMA.D some other options

相关内容