日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:OpenVMS オペレーティング・システムの概要
第 2 章:DCL を使用したシステムとの会話
第 3 章:ファイル情報の格納
第 4 章:ディレクトリ・ファイルの編成
第 5 章:拡張ファイル指定
第 6 章:ディスクとテープ・ドライブの使用方法
第 7 章:Mail を使用して他のユーザと通信する
第 8 章:EVE エディタによるテキスト・ファイルの編集
第 9 章:ファイルのソートとマージ
第 10 章:資源へのアクセスの制御
第 11 章:デバイスとファイルの論理名定義
第 12 章:シンボル,コマンド,式の定義
第 13 章:コマンド・プロシージャの概要
第 14 章:DCL での拡張プログラミング
第 15 章:レキシカル関数を使用しての情報の取得と処理
第 16 章:プロセスとバッチ・ジョブ
付録 A :文字セット
付録 B :コマンド・プロシージャの例
用語集
索引
PDF
OpenVMS ホーム
OpenVMS

OpenVMS
ユーザーズ・マニュアル


目次 索引



特定のキーを使用してソートしたファイルをマージする場合は, MERGEコマンド行の/KEY修飾子で同じキーを指定する必要があります。

キーを指定しない場合は, Merge は 第 9.2 節 で説明している省略時設定のキーを使用します。

たとえば,ファイルBILLING1.LST と BILLING4.LST がアカウント番号によってソート済み(/KEY=POSITION:5,SIZE:4,DECIMAL)であるとします。この 2 つのファイルを出力ファイル MAILING.LST にマージするには,次のコマンド行を入力します。

$ MERGE/KEY=(POSITION:5,SIZE:4,DECIMAL) -
_$ BILLING1.LST,BILLING4.LST MAILING.LST

マージ結果は次のとおりです。


マージしたいファイルがソート順になっていることを知っている場合は, /NOCHECK_SEQUENCE 修飾子を指定することにより,順序チェックを省略することができます。

9.5.2 同一キー・フィールドによるレコードのマージ

ソート操作の場合と同様に,入力ファイルに同じキー・フィールドを持つレコードが 2 つ以上ある場合,レコード順序が入力ファイルと同じになるとはかぎりません。同じキーを持つレコードの入力順序をそのまま残すには, MERGE コマンド行に /STABLE 修飾子を指定します。同じキーを持つレコードのうち 1 つだけを残すには, /NODUPLICATES 修飾子を指定します。

9.6 ターミナルからのレコードの入力

ソートまたはマージしようとするレコードは,ファイルに格納されている必要はありません。 SORT または MERGE コマンドを入力するときに,ターミナルからレコードを直接入力することができます。次の表に,その手順を示します。

手順 操作
1 SORT または MERGE コマンド行で,入力ファイルとして SYS$INPUT を指定する。

入力ファイル修飾子 /FORMAT を使用して,最も長いレコードのサイズ (バイト数) とそれに対応する入力ファイルのサイズ (ブロック数) を指定する。

2 後続の行にレコードを入力する。

Return を押して各レコードを終了させる。

3 Ctrl/Z を押してファイルを終了させる。

次の例は,ソートしようとする入力レコードを,ターミナルから直接に入力する場合のソート操作を示しています。

$ SORT/KEY=(POSITION:8,SIZE:15) -
_$ SYS$INPUT/FORMAT=(RECORD_SIZE:24,FILE_SIZE:10) BYNAME.LST
BST 7828 MCMAHON JANE 
ADM 7933 ROSENBERG HARRY 
COM 8102 KNIGHT MARTHA 
ANS 8042 BENTLEY PETER 
BIO 7951 LOWELL FRANK 
 

このコマンド・シーケンスは,レコードをソートし,その結果を BYNAME.LST という名前のファイルに格納します。

9.7 Sort/Merge 指定ファイルの使用方法

Sort/Merge では,指定ファイル を使用してソート定義を格納しておき,必要があればさらに複雑なソート条件を指定することができます。 ( 高性能 Sort/Merge ユーティリティでは,指定ファイルはサポートされていません。この機能は,OpenVMS Alpha の将来のリリースでサポートされる予定です。) 指定ファイルを作成するときは,任意の標準エディタやDCLのCREATEコマンドが使用できます。

Sort/Merge 指定ファイルを使用すると,次の操作を行えます。

  • ソート/マージの対象とするレコードの選択

  • 出力ファイルに格納されるレコードのフォーマットの変更

  • 条件付きキーまたはデータの使用

  • 複数のレコード形式の指定

  • 照合順序シーケンスの作成や変更

  • 作業ファイルの再割り当て

  • 頻繁に使用するソート/マージ操作をファイルに格納

指定ファイルを作成したら, /SPECIFICATION 修飾子を使用してファイル名を指定します。指定ファイルの省略時のファイル・タイプは .SRT です。

指定ファイル内では,各コマンドの先頭にスラッシュ (/) を付けます。コマンドが 2 行以上にわたる場合でも,行継続文字は必要ありません。

  注意
指定ファイルで使用する修飾子の多くは, Sort/Merge コマンド行で使用する DCL 修飾子と似ています。ただし,これらの修飾子の構文は異なる場合があります。たとえば,DCL レベルの /KEY 修飾子は,指定ファイルの /KEY 修飾子とは構文が異なります。指定ファイルの修飾子については, 第 9.9.3 項 を参照してください。

コマンド行で指定する DCL コマンド修飾子は,指定ファイルの中の対応する項目を無効にします。たとえば,DCL コマンド行で /KEY 修飾子を指定しても, Sort/Merge は指定ファイルの中の /KEY 修飾子を無視します。

一般に,指定ファイルの中の修飾子はどのような順序で指定してもかまいません。ただし,次のような場合には,順序が重要になります。

  • NUMBER:nキー要素を指定しない場合に,複数のキー・フィールドでソートする。

  • 出力形式を記述する。

  • 複数のレコード・タイプを定義する。

/COLLATING_SEQUENCE 修飾子と同時に FOLD,MODIFICATION,および IGNORE キーワードを指定する場合には, MODIFICATION 句とIGNORE 句をすべて指定してから FOLD 句を指定します。 /COLLATING_SEQUENCE 修飾子についての詳細は, 第 9.9.3 項 を参照してください。

指定ファイルの中にコメントを挿入するには,各コメント行の先頭に感嘆符 (!) を付けます。 DCL のコマンド行と異なり,指定ファイルは行を継続するときにハイフン (-) を必要としません。


  1. 次の例は,負と正のデータを昇順にソートするための指定ファイルです。

    ! Specification file for sorting negative and positive data 
    ! in ascending order 
    ! 
    /FIELD=(NAME=SIGN,POS:1,SIZ:1)  (1)
    /FIELD=(NAME=AMT,POS:2,SIZ:4)   (2)
    /CONDITION=(NAME=CHECK1,        (3)
              TEST=(SIGN EQ "-")) 
    /CONDITION=(NAME=CHECK2,        (4)
              TEST=(SIGN EQ " ")) 
    /INCLUDE=(CONDITION=CHECK1,     (5)
              KEY=(AMT,DESCENDING), 
              DATA=SIGN, 
              DATA=AMT) 
    /INCLUDE=(CONDITION=CHECK2,     (6)
              KEY=(AMT,ASCENDING), 
              DATA=SIGN, 
              DATA=AMT) 
    


    指定ファイルを確認する際には,次の点に注意してください。

    1. このコマンド行は,レコードの第 1 バイトで始まる,長さ 1 バイトのフィールドを定義し,このフィールドに名前 SIGN を割り当てる。

    2. このコマンド行は,レコードの第 2 バイトで始まる,長さ 4 バイトのフィールドを定義し,このフィールドに名前 AMT を割り当てる。

    3. これは条件文である。 SIGN バイトに負符号 ( - ) がある場合,条件 CHECK1 を満たす。

    4. これは条件文である。SIGN バイトがブランクの場合,条件 CHECK2 を満たす。

    5. 条件 CHECK1 を満たす場合,レコードを降順にソートする。

    6. 条件 CHECK2 を満たす場合,レコードを昇順にソートする。


    図 9-8 は,上の指定ファイルの例を BALANCES.LIS という入力ファイルに使用した結果を示しています。

    図 9-8 指定ファイルを使用した出力


  2. /FIELD=(NAME=RECORD_TYPE,POS:1,SIZ:1)   ! Record type, 1-byte 
    /FIELD=(NAME=PRICE,POS:2,SIZ:8)         ! Price, both files 
    /FIELD=(NAME=TAXES,POS:10,SIZ:5)        ! Taxes, both files 
    /FIELD=(NAME=STYLE_A,POS:15,SIZ:10)     ! Style, format A file 
    /FIELD=(NAME=STYLE_B,POS:20,SIZ:10)     ! Style, format B file 
    /FIELD=(NAME=ZIP_A,POS:25,SIZ:5)        ! Zip code, format A file 
    /FIELD=(NAME=ZIP_B,POS:15,SIZ:5)        ! Zip code, format B file 
    /CONDITION=(NAME=FORMAT_A,              ! Condition test, format A 
                TEST=(RECORD_TYPE EQ "A")) 
    /CONDITION=(NAME=FORMAT_B,              ! Condition test, format B 
                TEST=(RECORD_TYPE EQ "B")) 
    /INCLUDE=(CONDITION=FORMAT_A,           ! Output format, type A 
                KEY=ZIP_A, 
                DATA=PRICE, 
                DATA=TAXES, 
                DATA=STYLE_A, 
                DATA=ZIP_A) 
    /INCLUDE=(CONDITION=FORMAT_B,           ! Output format, type B 
                KEY=ZIP_B, 
                DATA=PRICE, 
                DATA=TAXES, 
                DATA=STYLE_B, 
                DATA=ZIP_B) 
    


    この例では,不動産代理店の 2 つの支社から送られた 2 つの入力ファイルが,指定ファイルの指示に従ってソートされます。1 つ目のファイルのレコードは,最初の位置に A がついており,次の形式になっています。

           |A|PRICE|TAXES|STYLE|ZIP| 
            1 2     10    15    25 
    


    2 つ目のファイルのレコードは,最初の位置に B がつき, style フィールドと zip code フィールドが,次のように逆になっています。

           |B|PRICE|TAXES|ZIP|STYLE| 
            1 2     10    15  20 
    


    これらの 2 つのファイルを,レコード A の形式の zip code フィールドでソートするとき,最初に両方のレコードのフィールドを,/FIELD 修飾子で定義します。その後,/CONDITION 修飾子で, 2 つのタイプのレコードを区別するためのテストを指定します。最後に /INCLUDE 修飾子を指定して,タイプ B のレコード形式をタイプ A のレコード形式に変更して出力します。
    /INCLUDE 修飾子でキー・フィールドまたはデータ・フィールドのいずれかを指定する場合,/INCLUDE 修飾子のSort 操作で明示的にすべてのキー・フィールドとデータ・フィールドを指定する必要があります。
    また,タイプAでもタイプBでもないレコードは,ソート時に排除されます。

  3. /COLLATING_SEQUENCE=(SEQUENCE= 
    ("AN","EB","AR","PR","AY","UN","UL", 
    "UG","EP","CT","OV","EC","0"-"9"), 
    MODIFICATION=("'"="19"), 
    FOLD) 
    


    この /COLLATING_SEQUENCE 修飾子では,ユーザ定義順序を指定します。この指定により,それぞれの月に,日付順の固有の値が定義されます。たとえば,SEMINAR.DAT というファイルを日付順に並べたい場合, SEMINAR.DAT ファイルは次のようになっています。

           16 NOV 1983   Communication Skills 
           05 APR 1984   Coping with Alcoholism 
           11 Jan '84    How to Be Assertive 
           12 OCT 1983   Improving Productivity 
           15 MAR 1984   Living with Your Teenager 
           08 FEB 1984   Single Parenting 
           07 Dec '83    Stress --- Causes and Cures 
           14 SEP 1983   Time Management 
    


    一次キーが year フィールドで,二次キーが month フィールドです。 month フィールドは数値ではありませんが,日付順に並べたいため,独自の照合順序を定義する必要があります。この場合,それぞれの月に固有のキー値を指定して,それぞれの月の 2 番目と 3 番目の文字を ( 日付順に ) ソートすることにより,これを行います。
    MODIFICATION オプションでは,アポストロフィ (') が 19 と同等になるよう指定していますが,これによって,'83 と 1984 が比較できるようになります。また FOLD オプションは,大文字と小文字が同等に扱われるよう指定します。
    この Sort 操作の出力は,次のようになります。

           14 SEP 1983   Time Management 
           12 OCT 1983   Improving Productivity 
           16 NOV 1983   Communication Skills 
           07 Dec '83    Stress --- Causes and Cures 
           11 Jan '84    How to Be Assertive 
           08 FEB 1984   Single Parenting 
           15 MAR 1984   Living with Your Teenager 
           05 APR 1984   Coping with Alcoholism 
    


    ユーザ定義照合順序の他の例については, 第 9.3 節 を参照してください。

  4. /FIELD=(NAME=AGENT,POSITION:20,SIZE:15) 
    /CONDITION=(NAME=AGENCY, 
                TEST=(AGENT EQ "Real-T Trust" 
                OR 
                AGENT EQ "Realty Trust")) 
    /DATA=(IF AGENCY THEN "Realty Trust" ELSE AGENT) 
    


    この例では,2 つの不動産ファイルをソートします。 1 つのファイルは,ある代理店が Real-T Trust と呼ぶもので,もう 1 つのファイルは Realty Trust と呼ばれます。 /CONDITION 修飾子と /DATA 修飾子により, Realty Trust のソート出力ファイルに AGENT フィールドがリストされることになります。

  5. /FIELD=(NAME=ZIP,POSITION:60,SIZE:6) 
    /CONDITION=(NAME=LOCATION, 
                TEST=(ZIP EQ "01863")) 
    /KEY=(IF LOCATION THEN 1 
          ELSE 2) 
    


    この例では,郵便番号 01863 を持つすべてのレコードがソート出力ファイルの最初にリストされます。条件テストは,/FIELD 修飾子で定義されているように ZIP フィールドで行われます。条件名は LOCATION になっています。/KEY 修飾子にある値 1 と 2 は,条件を満たすレコードと条件を満たさないレコードの相対順序を表すものです。

  6. /FIELD=(NAME=ZIP,POSITION:60,SIZE:6) 
    /CONDITION=(NAME=LOCATION, 
                TEST=(ZIP EQ "01863")) 
    /DATA=(IF LOCATION THEN "NORTH CHELMSFORD" 
           ELSE "Outside district") 
    


    この例では,/CONDITION 修飾子により,郵便番号 01863 についてテストが行われます。 /DATA 修飾子は,テスト結果に従って, town フィールドの名前が出力レコードに追加されるよう指定します。

  7. /FIELD=(NAME=FFLOAT,POS:1,SIZ:0,F_FLOATING) 
    /CONDITION=(NAME=CFFLOAT,TEST=(FFLOAT GE 100)) 
    /OMIT=(CONDITION=CFFLOAT) 
    


    この例では,/FIELD 修飾子でフィールド FFLOAT が F_FLOATING と定義されているため,数値 100 が F_FLOATING データ型とみなされます。

  8. /FIELD=(NAME=AGENT,POSITION:1,SIZE:5) 
    /FIELD=(NAME=ZIP,POSITION:6,SIZE:3) 
    /FIELD=(NAME=STYLE,POSITION:10,SIZE:5) 
    /FIELD=(NAME=CONDITION,POSITION:16,SIZE:9) 
    /FIELD=(NAME=PRICE,POSITION:26,SIZE:5) 
    /FIELD=(NAME=TAXES,POSITION:32,SIZE:5) 
    /DATA=PRICE 
    /DATA="  " 
    /DATA=TAXES 
    /DATA="  " 
    /DATA=STYLE 
    /DATA="  " 
    /DATA=ZIP 
    /DATA="  " 
    /DATA=AGENT 
    


    この /FIELD 修飾子は,次の形式を持つ入力ファイルのレコードのフィールドを定義します。

    AGENT ZIP STYLE CONDITION PRICE TAXES 
    


    /DATA 修飾子では,/FIELD 修飾子で定義されているフィールド名を使用しますが,レコードを再フォーマットして,次の形式の出力レコードを作成します。

    PRICE TAXES STYLE ZIP AGENT 
    



9.8 ソートまたはマージ操作の最適化

ソート操作またはマージ操作の効率は,ソート環境により,いくつかの方法で向上させることができます。 SORT コマンドまたは MERGE コマンドに /STATISTICS 修飾子を使用すると,ソート環境の変数を表示できます。

この統計情報を調べてから,この後に説明する最適化オプションの使用を検討してみてください。

SORT コマンドまたは MERGE コマンドに /STATISTICS 修飾子を指定すると,次のような出力が表示されます。

$ SORT/STATISTICS PAGEANT.LIS DOCUMENT.LIS
                  OpenVMS Sort/Merge Statistics 
 
Records read:           3 (1)     Input record length:       26 
Records sorted:         3        Internal length:           28 
Records output:         3        Output record length:      26 
Working set extent: 16384 (2)     Sort tree size:            42 
Virtual memory:       392        Number of initial runs:     0 
Direct I/O:            10        Maximum merge order:        0 
Buffered I/O:          11        Number of merge passes:     0 
Page faults:          158 (3)     Work file allocation:       0 (4)
Elapsed time: 00:00:00.54        Elapsed CPU:      00:00:00.03 (5)

この統計表示から次のことが分かります。

  1. Records read
    ソート操作中に読み込まれたレコードの数を示す。ソート操作で特定のレコードを省略する方法についての詳細は, 第 9.8.2 項 を参照。

  2. Working set extent
    ソート操作を実行するために確保されたブロックの数を示す。ワーキング・セットを大きくする方法についての詳細は, 第 9.8.4 項 を参照。

  3. Page faults
    オペレーティング・システムが,物理メモリからページング・デバイスへプロセスを転送した回数を示す。ページングをしないようにする方法についての詳細は, 第 9.8.4 項 を参照。

  4. Work file allocation
    作業ファイルのために確保されたディスク領域のサイズを示す。作業ファイルについての詳細は, 第 9.8.3 項 を参照。

  5. Elapsed CPU
    オペレーティング・システムがソート操作の処理に費やした CPU 時間を示す。別のソート方法を選択して時間を節約する方法についての詳細は, 第 9.8.1 項 を参照。



9.8.1 ソートのプロセス

Sort では,内部でデータをソートするときに使用する,レコード,タグ,アドレス,索引の 4 つのプロセスを定義します。 ( 高性能 Sort/Merge ユーティリティでは,レコード・プロセスのみがサポートされます。タグ,アドレス,索引の各プロセスについては, OpenVMS Alpha の将来のリリースでサポートされる予定です。) RECORD が省略時のプロセスになります。指定するプロセスのタイプによっては,必要な記憶域の量と同様に, Sort 操作の効率も変わることがあります。その他のソート・プロセスについての詳細は, 第 9.2.6 項 を参照してください。

どのタイプのソート方法を使用するかは,次の点を考慮して決定してください。

  • 出力ファイルをどのように使用するか

    • レコード・ソートとタグ・ソートは,ソート済みの全レコードを含むファイルを生成するため,これらのファイルはいつでも使用できる。

    • アドレス・ソートと索引順編成ソートの出力ファイルは,Pascal,FORTRAN, MACRO,C などのプログラミング言語で作成されたプログラムによって処理できる。

    • アドレス・ソートは,入力ファイルの中のレコードに対するポインタのリストを作成する。このリストは,バイナリ形式の RFA と,複数の入力ファイルをソートするときのファイル番号から構成される。プログラムは,ポインタを使用してレコードにアクセスする。

    • 索引順編成ソートは,RFA とキー・フィールドに加えて,複数のファイルをソートするときのファイル番号が含まれる出力ファイルを作成する。これらのキー・フィールドの形式は入力ファイルと同じ。キー・フィールドの内容に従ってそれ以降の処理を決定する必要があるプログラムの場合には,アドレス・ソートではなく,索引順編成ソートを選択する。


    あるファイルのレコードを様々な目的で並べ換える必要がある場合には,アドレス・ソートまたは索引順編成ソートによって生成された複数の出力ファイルを格納する。望ましい順序で並べられたメイン・ファイルの中のレコードにアクセスするには,この出力ファイルを使用する。

  • ソートに使用可能な一時的な格納領域
    タグ・ソートは,レコード・ソートに比べて,使用する一時格納領域が少なくてすむ。 レコード・ソート は,ソート中はレコードに手を加えないので,ファイルが大きい場合には使用する作業領域が多くなる。アドレス・ソートと索引順編成ソートは,一時格納領域をほとんど使用しない。

  • 使用する入力デバイスと出力デバイスのタイプ
    カード,磁気テープ,ディスクから入力を受け付けるプロセスは,レコード・ソートだけである。タグ・ソートとレコード・ソートの結果はどの出力デバイスにも出力できるが,アドレス・ソートと索引順編成ソートの結果は,バイナリ・データを受け付けるデバイスに出力しなければならない。

  • 処理速度の相違
    ソートしたレコードを操作の最中に検索する予定がある場合,通常,レコード・ソートが最も処理速度が速くなる。それ以外の場合には,アドレス・ソートと索引順編成ソートの処理速度が速くなる。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.