変数テキストを使用して2つのキーでファイルの行を並べ替える

変数テキストを使用して2つのキーでファイルの行を並べ替える

私はDBAであり、次の形式のDMLを提供する再構成ビルドプロセスの出力を持っています。

REORG TABLE SCHEMA.A その他のオプション
REORG TABLE SCHEMA.B その他のオプション
REORG TABLE SCHEMA.C その他のオプション
REORG TABLE SCHEMA.D その他のオプション
REORG はテーブル SCHEMA.A のすべてのインデックスを生成します。その他のオプション
REORG はテーブル SCHEMA.B のすべてのインデックスを生成します。その他のオプション
REORG はテーブル SCHEMA.C のすべてのインデックスを生成します。その他のオプション
REORG はテーブル SCHEMA.D のすべてのインデックスを生成します。その他のオプション
TABLE SCHEMA.AのRUNSTATSその他オプション
RUNSTATS ON TABLE SCHEMA.B その他のオプション
RUNSTATS ON TABLE SCHEMA.C その他のオプション
RUNSTATS ON TABLE SCHEMA.D その他のオプション

ここでは扱っていないので、このファイルを次の順序で並べ替える必要があります(各テーブルには4つ以下のテーブルがあるか、3つ以下のエントリがある可能性があります)。

テーブルスキーマの再構成
表SCHEMA.Aの再構成されたすべての索引
SCHEMA.A テーブルの RUNSTATS
再構成テーブルスキーマB
表SCHEMA.Bの再構成されたすべての索引
テーブルSCHEMA.BのRUNSTATS
...など

つまり。ファイルの各テーブルに対してREORG TABLES、REORG INDEX、RUNSTATを実行します。

私は次の(そして変形)を試しました。

sort-t。 -k2テスト。
sort-t。 -k2.1,2.8 -k1.1,1.7 test.fil

ただし、問題は、セカンダリソート(REORG TABLE、REORG INDEX、およびRUNSTAT)が正しく機能しているようです。

上記の最初のsortコマンドは、テーブル名に基づいて降順にオブジェクトを取得し、次にk2の長さでソートします。

2番目のソートコマンドは、アルファベットで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スクリプトは、各行の前にタブで区切られた2つの値を追加します。

  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

おすすめ記事