

AWS Mainframe Modernization Service(관리형 런타임 환경 환경 환경)는 더 이상 신규 고객에게 공개되지 않습니다. AWS Mainframe Modernization Service(관리형 런타임 환경 환경)와 유사한 기능은 AWS Mainframe Modernization Service(자체 관리형 환경)를 참조하세요. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. 자세한 내용은 [AWS Mainframe Modernization 가용성 변경을](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html) 참조하세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 유틸리티 정렬
<a name="system-sort-utilities"></a>

정렬 유틸리티는 참조에 유틸리티에 대한 특별한 의미가 있는 데이터 세트를 사용합니다. 따라서 현대화된 측의 모든 정렬 유틸리티는 groovy 스크립트에서 동일한 호출 패턴을 공유합니다.

```
mpr.withFileConfigurations(<FILE CONFIGURATIONS DETAILS>...)
   .withParameters(params)
   .runProgram("<SORT UTILITY ALIAS>")
```

여기서 `mpr`는 `MainProgramRunner` 인스턴스입니다([이 페이지의](https://docs.aws.amazon.com/m2/latest/userguide/ba-shared-structure.html#ba-shared-structure-run-call) 스크립트 호출 프로그램 섹션 참조). 정렬 유틸리티 별칭은 아래 섹션에 나와 있습니다.

JCL 스크립트의 `DD` (데이터 세트 정의) 항목은 `mpr.withFileConfigurations()` 메서드에 대한 인수 역할을 하는 파일 구성의 세부 정보에서 항목으로 현대화됩니다. 해당 개념에 대한 그림은 아래 샘플을 참조하세요.

## SORT/SYNCSORT/ICEMAN
<a name="sort-syncsort-iceman"></a>

### 용도
<a name="sort-purpose"></a>

이 프로그램은 제공된 기준에 따라 데이터 세트에서 데이터를 sort/merge/copy하는 데 사용되는 다양한 메인프레임 SORT 유틸리티를 에뮬레이션합니다. 다음 프로그램 별칭을 사용할 수 있습니다(및 해당 레거시 정렬 유틸리티 이름과 일치).
+ `SORT`
+ `SYNCSORT`
+ `ICEMAN`

제어 카드 및 레거시 정렬 유틸리티 기능에 있는 SORT/MERGE 명령에 대한 세부 정보는 여기에 제공되지 않지만 기존 관련 레거시 플랫폼 설명서에서 가져와야 합니다.

### 서명
<a name="sort-signature"></a>

프로그램은 인수를 취하지 않지만 대신 특정 데이터 세트 참조에 의존합니다.
+ `SYSIN` 데이터 세트('컨트롤 카드'라고도 함)에는 정렬/병합 컨트롤 문이 있습니다.
+ 선택적 `SYMNAMES` 데이터 세트는 SYSIN 콘텐츠에 변수 대체 지시문을 포함합니다.
+ 선택적 `SORTXDUP` 또는 `SORTXSUM` 데이터 세트를 사용하여 중복 레코드를 저장할 수 있습니다.
+ 처리할 `SORTIN` 또는 `SORTDBIN` 보관 레코드가 접두사로 붙은 데이터 세트(입력)
+ `SORTOUT` 데이터 세트에는 프로그램의 결과가 들어 있습니다(출력).
+ 일부 레거시 작업 스크립트에서 발견된 SORT WORK 데이터 세트에 대한 `SORTWK` 정의는 무시됩니다(현대화된 호출에서는 표시되지 않음). 정렬 작업 데이터 세트는 항상 최신 환경에서 동적으로 할당됩니다.
+ DD가 `SORTJN` (접두사)로 시작하는 두 데이터 세트에는 조인 키 명령(정렬 프로세스 중에 데이터 세트를 조인하는 데 사용됨)과 관련된 레코드가 포함됩니다.

예를 들어 다음 조인 키 명령을 고려합니다.

```
JOINKEYS FILE=F1,FIELDS=(13,5,A)
JOINKEYS FILE=F2,FIELDS=(24,5,A)
```

여기서 조인 키는 길이가 5이며 다음과 같이 시작됩니다.
+ 데이터 세트의 레코드에 대한 위치 13`SORTJNF1`(`SORTJN`접두사 및 파일 연결`F1`)
+ 데이터 세트의 레코드에 대한 위치 24`SORTJNF2`(`SORTJN`접두사 및 파일 연결`F2`)

### 검사/오류 처리
<a name="sort-error"></a>
+ 입력 파일(`SORTIN`)에 `SHR` 처리가 있지만 찾을 수 없는 경우 오류 메시지가 로깅되고 프로그램 반환 코드가 1로 설정되며 프로그램 실행이 중지됩니다(정렬이 발생하지 않고 출력이 생성되지 않음).

다음과 같은 경우 전용 메시지가 `RuntimeException` 표시됩니다.
+ 프로그램 호출에 데이터베이스에 대한 연결이 필요하지만(`SORTDBIN`데이터 세트가 사용되는 경우가 아님`SORTIN`) 유효한 데이터 소스를 찾을 수 없는 경우
+ 출력 파일(`SORTOUT`)이 제대로 정의되지 않은 경우
+ 제어 카드에 있는 명령을 이해할 수 없거나 지원되지 않는 경우
+ `SORT JOINKEYS` 사례에 대해 정확히 두 개의 입력 파일이 제공되지 않는 경우

### 샘플 사용량
<a name="sort-sample"></a>

#### MERGE 샘플
<a name="sort-merge-sample"></a>

다음은 작업 스크립트 조각에서 `ICEMAN` 호출하는 샘플입니다.

제어 카드는 인라인이며 입력 파일의 필드를 병합하는 명령입니다(`SYSIN`항목 참조).

```
//*
//PASOSO03 EXEC PGM=ICEMAN,REGION=0M
//SORTIN01 DD DSN=input(input809a.data),DISP=SHR,LRECL=10
//SORTIN02 DD DSN=input(input809b.data),DISP=SHR,LRECL=10
//SORTOUT  DD DSN=output(out809.txt),DISP=(,PASS),LRECL=10
//SORTWK01 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U
//SORTWK02 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U
//SYSIN    DD *
   MERGE  FIELDS=(1,6,PD,A,7,2,CH,A)
   END
/*
```

또한 일치하는 현대화된 Groovy 스크립트 조각 -- 이미 언급했듯이 현대화 프로세스 중에는 `SORTWK` 항목이 고려되지 않으며 인라인 컨트롤 카드가 레거시 컨트롤 카드 콘텐츠와 정확히 일치한다는 점에 유의하세요.

```
// STEP PASOSO03 - PGM - ICEMAN***************************************************
def stepPASOSO03(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("PASOSO03", "ICEMAN", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .fileSystem("SORTIN01")
                        .path("input(input809a.data)").recordSize(10)
                        .disposition("SHR")
                        .build()
                        .fileSystem("SORTIN02")
                        .path("input(input809b.data)").recordSize(10)
                        .disposition("SHR")
                        .build()
                        .fileSystem("SORTOUT")
                        .path("output(out809.txt)").recordSize(10)
                        .normalTermination("PASS")
                        .build()
                        .fileSystem("SYSIN")
                        .stream(
"""   MERGE  FIELDS=(1,6,PD,A,7,2,CH,A)
   END                                                                          """, getEncoding())
                        .build()
                        .getFileConfigurations())
                        .withParameters(params)
                    .runProgram("ICEMAN")
                })
        }
    }
}
```

#### 단순 SORT 샘플
<a name="sort-simple-sample"></a>

Carddemo 샘플 애플리케이션에서 선택한 인라인 제어 카드가 있는 간단한 레거시 SORT 단계(작업 스크립트 코드 조각):

```
//*********************************************************************
//* CREATE COPY OF TRANSACT FILE WITH CARD NUMBER AND TRAN ID AS KEY
//*********************************************************************
//STEP010  EXEC PGM=SORT
//SORTIN   DD  DISP=SHR,DSN=AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS
//SYSPRINT DD  SYSOUT=*
//SYSOUT   DD  SYSOUT=*
//SORTOUT  DD  DSN=AWS.M2.CARDDEMO.TRXFL.SEQ,
//             DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
//             DCB=(LRECL=350,BLKSIZE=3500,RECFM=FB),
//             SPACE=(CYL,(1,1),RLSE)
//SYSIN    DD *
  SORT FIELDS=(263,16,CH,A,1,16,CH,A)
  OUTREC FIELDS=(1:263,16,17:1,262,279:279,50)
/*
```

및 일치하는 현대화된 groovy 스크립트 조각:

```
// STEP STEP010 - PGM - SORT******************************************************
def stepSTEP010(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("STEP010", "SORT", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .bluesam("SORTIN")
                        .dataset("AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS")
                        .disposition("SHR")
                        .build()
                        .systemOut("SYSPRINT")
                        .output("*")
                        .build()
                        .systemOut("SYSOUT")
                        .output("*")
                        .build()
                        .fileSystem("SORTOUT")
                        .path("AWS.M2.CARDDEMO.TRXFL.SEQ").recordSize(350)
                        .disposition("NEW")
                        .normalTermination("CATLG")
                        .abnormalTermination("DELETE")
                        .build()
                        .fileSystem("SYSIN")
                        .stream(
"""  SORT FIELDS=(263,16,CH,A,1,16,CH,A)
  OUTREC FIELDS=(1:263,16,17:1,262,279:279,50)""", getEncoding())
                        .build()
                        .getFileConfigurations())
                    .withParameters(params)
                    .runProgram("SORT")
                })
        }
    }
}
```

인라인 컨트롤 카드는 레거시 컨트롤 카드 콘텐츠를 수정하지 않고 "있는 그대로" 사용됩니다.

## ICETOOL
<a name="icetool"></a>

### 용도
<a name="icetool-purpose"></a>

ICETOOL 유틸리티는 단일 작업 단계(데이터 조작, 정렬 및 분석)에서 데이터 세트에 대해 여러 작업을 수행하는 데 사용됩니다.

지원되는 코어 연산자는 다음과 같습니다.
+ `COPY` - 입력에서 출력 파일로 데이터를 복사합니다.
+ `SORT` - 지정된 정렬 카드/기준을 사용하여 데이터를 정렬합니다.
+ `SELECT` - 조건에 따라 특정 레코드를 필터링하고 선택합니다.
+ `SPLICE` - 여러 소스의 데이터를 병합/조인합니다.
+ `COUNT` - 지정된 기준을 충족하는 레코드 수를 계산합니다.
+ `OCCUR` - 데이터의 발생 패턴을 분석합니다.

SPLICE 운영자의 경우 유틸리티는 최적화된 성능을 보장하기 위해 데이터 청킹 전략을 기반으로 다중 스레드 접근 방식을 사용합니다.

연산자에 대한 세부 정보는 적절한 레거시 플랫폼 설명서에서 가져와야 합니다.

### 서명
<a name="icetool-signature"></a>

`ICETOOL` 유틸리티는 파라미터를 사용하지 않지만 특정 데이터 세트에 의존합니다.
+ `TOOLIN` 데이터 세트에는 유틸리티에서 처리할 제어 문이 포함되어 있습니다.
+ `TOOLMSG` 현대화된 `ICETOOL` 유틸리티에서 현재 및 `DFSMSG` 데이터 세트를 사용하지 않음(무시됨)
+ `IN`는 입력 데이터 세트의 접두사입니다(처리할 레코드).
+ `OUT`는 출력 데이터 세트의 접두사입니다(처리로 인한 레코드).
+ 제어 카드의 제어 문에서 다른 데이터 세트를 참조할 수 있습니다.

### 검사/오류 처리
<a name="icetool-error"></a>

다음과 같은 경우 관련 메시지와 함께이 발생합니다`RuntimeException`.
+ 제어 문 중 하나에 사용된 연산자가 지원되지 않는 경우
+ 지원되지 않는 명령이 제공된 경우 모든 연산자에 대해

### 샘플 사용량
<a name="icetool-sample"></a>

#### ICETOOL SORT 샘플
<a name="icetool-sort-sample"></a>

다음은 정렬 목적으로 ICETOOL을 사용하는 레거시 jcl 샘플입니다.
+ 각 SORT 연산자 제어 문은 USING 키워드를 통해 참조가 지정된 전용 제어 카드를 사용합니다.
+ 모든 컨트롤 카드는 정의 뒤에 정의`TOOLIN`되며 인라인으로 표시됩니다( `SEL1CNTL` 및 다음 `*CNTL` 항목 참조).

```
//SAMPLO52 EXEC PGM=ICETOOL,REGION=1024K
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//IN1      DD DSN=input(input846a.data),DISP=SHR
//            DCB=(RECFM=F,LRECL=8)
//IN2      DD DSN=input(input846b.data),DISP=SHR
//            DCB=(RECFM=F,LRECL=8)
//OUT1     DD DSN=output(out846a.txt),DISP=(,CATLG)
//            DCB=(RECFM=F,LRECL=8)
//OUT2     DD DSN=output(out846b.txt),DISP=(,CATLG)
//            DCB=(RECFM=V)
//OUT3     DD DSN=output(out846c.txt),DISP=(,CATLG)
//            DCB=(RECFM=V)
//TOOLIN   DD *
  SORT FROM(IN1) TO(OUT1) USING(SEL1)
  SORT FROM(IN2) TO(OUT1) USING(SEL2)
  SORT FROM(IN1) TO(OUT2) USING(SEL3)
  SORT FROM(IN2) TO(OUT2) USING(SEL4)
  SORT FROM(IN1) TO(OUT3) USING(SEL5)
  SORT FROM(IN2) TO(OUT3) USING(SEL6)
/*
//SEL1CNTL DD *
    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))
//*
//SEL2CNTL DD *
   OPTION COPY,SKIPREC=1
   OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))
//*
//SEL3CNTL DD *
    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '
//*
//SEL4CNTL DD *
    OPTION COPY,SKIPREC=1
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '
//*
//SEL5CNTL DD *
    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '
//*
//SEL6CNTL DD *
    OPTION COPY,SKIPREC=1
    OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '
//*
```

현대화되면 일치하는 Groovy 스크립트 조각은 다음과 같습니다.

```
// STEP SAMPLO52 - PGM - ICETOOL**************************************************
def stepSAMPLO52(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("SAMPLO52", "ICETOOL", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .systemOut("TOOLMSG")
                        .output("*")
                        .build()
                        .systemOut("DFSMSG")
                        .output("*")
                        .build()
                        .fileSystem("IN1")
                        .path("input(input846a.data)").recordSize(8)
                        .disposition("SHR")
                        .build()
                        .fileSystem("IN2")
                        .path("input(input846b.data)").recordSize(8)
                        .disposition("SHR")
                        .build()
                        .fileSystem("OUT1")
                        .path("output(out846a.txt)").recordSize(8)
                        .normalTermination("CATLG")
                        .build()
                        .fileSystem("OUT2")
                        .path("output(out846b.txt)").rdw(true)
                        .normalTermination("CATLG")
                        .build()
                        .fileSystem("OUT3")
                        .path("output(out846c.txt)").rdw(true)
                        .normalTermination("CATLG")
                        .build()
                        .fileSystem("TOOLIN")
                        .stream(
"""  SORT FROM(IN1) TO(OUT1) USING(SEL1)
  SORT FROM(IN2) TO(OUT1) USING(SEL2)
  SORT FROM(IN1) TO(OUT2) USING(SEL3)
  SORT FROM(IN2) TO(OUT2) USING(SEL4)
  SORT FROM(IN1) TO(OUT3) USING(SEL5)
  SORT FROM(IN2) TO(OUT3) USING(SEL6)               """, getEncoding())
                        .build()
                        .fileSystem("SEL1CNTL")
                        .stream(
"""    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) """, getEncoding())
                        .build()
                        .fileSystem("SEL2CNTL")
                        .stream(
"""   OPTION COPY,SKIPREC=1
   OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))""", getEncoding())
                        .build()
                        .fileSystem("SEL3CNTL")
                        .stream(
"""    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '""", getEncoding())
                        .build()
                        .fileSystem("SEL4CNTL")
                        .stream(
"""    OPTION COPY,SKIPREC=1
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '""", getEncoding())
                        .build()
                        .fileSystem("SEL5CNTL")
                        .stream(
"""    OPTION COPY
    OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '""", getEncoding())
                        .build()
                        .fileSystem("SEL6CNTL")
                        .stream(
"""    OPTION COPY,SKIPREC=1
    OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')),
    FTOV,VLTRIM=C' '""", getEncoding())
                        .build()
                        .getFileConfigurations())
                    .withParameters(params)
                    .runProgram("ICETOOL")
                })
        }
    }
}
```

참고:
+ 인라인 컨트롤 카드는 "있는 그대로" 사용되며 레거시 컨트롤 카드에서 변환이 발생하지 않았습니다.
+ `TOOLMSG` 및 `DFSMSG`는 현대화된 버전에서 정의되지만 런타임 시 무시됩니다.
+ 레거시 버전과 현대화된 버전 모두에서 제어 카드는 `CNTL` 접미사로 정의되지만 `TOOLIN` 데이터 세트의 명령에서 접미사 없이 참조됩니다. 예:에서 `SORT FROM(IN1) TO(OUT1) USING(SEL1)`는 `SEL1CNTL` 데이터 세트 정의를 `USING(SEL1)` 참조합니다.

#### ICETOOL COPY 샘플
<a name="icetool-copy-sample"></a>

다음은 COPY 연산자를 사용하는 또 다른 ICETOOL 샘플입니다. `TOOLIN`는 jcl 스크립트 조각에 인라인으로 표시됩니다.

```
//SAMPLO51 EXEC PGM=ICETOOL,REGION=1024K
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//IN1      DD DSN=input(input831.data),DISP=SHR
//            DCB=(RECFM=F,LRECL=12)
//OUT1     DD DSN=output(out831a.txt),DISP=OLD
//            DCB=(RECFM=F,LRECL=12)
//OUT2     DD DSN=output(out831b.txt),DISP=OLD
//            DCB=(RECFM=F,LRECL=12)
//TOOLIN   DD *
  COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1)
/*
//SEL1CNTL DD *
  OPTION COPY
  OUTFIL INCLUDE=(7,2,CH,EQ,C'10')
//*
```

다음은 현대화된 매칭 그루비 스크립트 조각입니다.

```
// STEP SAMPLO51 - PGM - ICETOOL**************************************************
def stepSAMPLO51(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("SAMPLO51", "ICETOOL", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .systemOut("TOOLMSG")
                        .output("*")
                        .build()
                        .systemOut("DFSMSG")
                        .output("*")
                        .build()
                        .fileSystem("IN1")
                        .path("input(input831.data)").recordSize(12)
                        .disposition("SHR")
                        .build()
                        .fileSystem("OUT1")
                        .path("output(out831a.txt)").recordSize(12)
                        .disposition("OLD")
                        .build()
                        .fileSystem("OUT2")
                        .path("output(out831b.txt)").recordSize(12)
                        .disposition("OLD")
                        .build()
                        .fileSystem("TOOLIN")
                        .stream(
"""  COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1)
  COPY FROM(IN1) TO(OUT3,OUT4)
  COPY FROM(IN1) TO(OUT4)
  COPY FROM(IN1) TO(OUT5,OUT6)                       """, getEncoding())
                        .build()
                        .fileSystem("SEL1CNTL")
                        .stream(
"""  OPTION COPY
  OUTFIL INCLUDE=(7,2,CH,EQ,C'10')""", getEncoding())
                        .build()
                        .getFileConfigurations())
                    .withParameters(params)
                    .runProgram("ICETOOL")
                })
        }
    }
}
```

## MFSORT
<a name="mfsort"></a>

### 용도
<a name="mfsort-purpose"></a>

이 유틸리티 프로그램은 Micro Focus 환경에서 발견되는 MFSORT라는 정렬 유틸리티의 동작을 모방하기 위한 것입니다(일반적으로 명령줄 또는 레거시 환경의 스크립트에서 호출됨).

내부적으로 프로그램은 실제 정렬 작업을 [SORT/SYNCSORT/ICEMAN](#sort-syncsort-iceman) 유틸리티 프로그램에 위임합니다.

### 서명
<a name="mfsort-signature"></a>

다음 레거시 구문만 지원됩니다. `mfsort take <control card>` 

직접 지침은를 로 호출합니다. `mfsort <instructions>`는 지원되지 않습니다.

인수를 취하지 않습니다. *인수* 지시문은 MFSORT가 작동하는 명령`TAKE`이 포함된 로 참조되는 데이터 세트를 사용하여 에뮬레이션됩니다.

### 검사/오류 처리
<a name="mfsort-error"></a>
+ `TAKE` 데이터 세트가 누락되었거나 유효하지 않은 경우이 발생합니다`RuntimeException`.
+ MFSORT에서 SORT로의 위임을 고려할 때 도 여기에 [검사/오류 처리](#sort-error) 적용됩니다.

### 샘플 사용량
<a name="mfsort-sample"></a>

다음 명령 호출은 샘플 MFSORT 사용량을 보여줍니다.

```
mfsort take TESTSRT1.CTL
```

다음은 현대화된 groovy 스크립트 조각과 일치합니다.

```
mpr.withFileConfigurations(new FileConfigurationUtils()
.fileSystem("TAKE")
.path("input(TESTSRT1.CTL)")
.build()
.getFileConfigurations())
.withArguments("input") // relative path for use and give files
.runProgram("MFSORT");
```