파일의 예고편에서 레코드 수 확인

파일의 예고편에서 레코드 수 확인

Record_count전체 세부 레코드가 트레일러 레코드와 동일한지 확인하고 일치하지 않으면 오류를 발생시키는 스크립트를 작성하려고 합니다 .

견본:

HDR9185        20210601094001202105311.11j

DTL226-42742-14                        32.389185        NM30100000178103      D207935784ZAG Desjardins Trust              CAD      5470.34       32.38A E  2.0500      5549.4420220215NESBITT BURNS INC A/C 226-42742-14 (5H94798)                                                                            C      5014.0020170215N30100000178103                5H94798   ILPYA7SM71 
                   
DTL210-86993-11                        21.979185        NM30100000187369      D207989578ZAG Desjardins Trust              CAD      5036.97       21.97N A  2.0500      5117.8120220315NESBITT BURNS INC ITF A/C 210-86993-11 (5J10948)                                                                        C      5015.0020170315N30100000187369                5J10948   ILQETLZDH1 
                  
TRL      02         93084.00

예고편 레코드는 02레코드 번호입니다.

내 코드:

if ! awk -F "|" ' /^HDR/ { h++; next; } /^TRL/ {t++; next} END { exit( (h != 1) || t != 1 || $NF != NR - 2 ); }' sample.txt
then
   echo "file did not pass validation test"
   exit 1
fi
 echo "Validated successfully"

내 기록이 트레일러 수와 일치하거나 일치하지 않는 경우에도 "파일 유효성 검사 테스트 실패"라는 표준 출력이 발생합니다.

답변1

귀하의 코드에서는 데이터가 |필드 구분 기호로 사용된다고 가정하는 것 같지만 그렇지 않습니다. 있다고 주장하고 싶은 것 같습니다.하나헤더 레코드( HDR...) 및하나tail Record( TRL) 및 tail 레코드는 올바른 숫자, 즉 중간 데이터 records() 수를 언급합니다 DTL....

파일에 빈 줄이 포함될 수 있으므로 무시해야 한다고 가정합니다.

프로그램 awk:

$1 ~ /^HDR/ { h++ }
$1 ~ /^DTL/ { d++ }
$1 == "TRL" { t++; ok = (d == $2) }
END { exit !(h == 1 && t == 1 && ok) }

HDR...레코드 에 대해 h증가됩니다. 각 DTL...레코드 에 대해 d증가됩니다. TRL레코드가 발견 되면 데이터 행 수가 올바른지 알려주는 t부울 값을 증가시키고 계산합니다 .ok

END헤더와 트레일러 레코드가 우연히 발견되고 부울 ok값이 다음과 같은 경우진짜.

다음 코드는 레코드가 순서가 잘못된 경우(0 데이터 레코드를 허용하는 동안) 0이 아닌 종료 상태로 종료됩니다.

BEGIN { ok = 1 }
$1 ~ /^HDR/ { h++; ok = (h == 1 && d ==  0 && t == 0) }
$1 ~ /^DTL/ { d++; ok = (h == 1            && t == 0) }
$1 == "TRL" { t++; ok = (h == 1 && d == $2 && t == 1) }
!ok { exit }
END { exit !(h == 1 && t == 1 && ok) }

이는 부울 변수에 있는 데이터의 전체 유효성을 유지 ok하고 해당 변수가 롤오버될 때 0이 아닌 종료 상태로 종료됩니다.잘못된(또는 아직 존재하는 경우 종료 상태 0진짜전체 코드 실행 프로세스). 블록에 도달할 때 정확히 하나의 헤드 및 테일 레코드가 표시되는지 확인해야 합니다 END. 그렇지 않으면 빈 파일이 올바른지 확인합니다.

awk프로그램 중 하나를 실행하려면 파일(여기 validate.awk)에 넣고 다음을 사용하세요.

if awk -f validate.awk sample.txt; then
    echo 'file ok'
else
    echo 'file not validated'
fi

또는 명령줄에서 전체 프로그램을 작은따옴표로 묶은 문자열로 제공합니다.

if awk '$1 ~ /^HDR/ { h++ } $1 ~ /^DTL/ { d++ } $1 == "TRL" { t++; ok = (d == $2) } END { exit !(h == 1 && t == 1 && ok) }' sample.txt
then
    echo 'file ok'
else
    echo 'file not validated'
fi

주소 지정코멘트레코드가 모든 유형의 레코드 개수가 있는 것처럼 TRL보일 수 있다고 가정해 보겠습니다 .TRL0009 93084.000009

이 경우 첫 번째 awk프로그램은 다음과 같습니다.

$1 ~ /^HDR/ { h++ }
$1 ~ /^DTL/ { d++ }
$1 ~ /^TRL/ { t++; ok = ( d == substr($0,4,4) - 2 ) }
END { exit !(h == 1 && t == 1 && ok) }

여기서는 (원래 입력 라인) 위치 4에서 시작하고 길이가 4인 문자열을 substr($0,4,4)선택합니다 . $0헤드 및 테일 레코드를 계산하기 위해 이 숫자에서 2를 뺍니다.

답변2

아마도:

if awk -v RS='' '$1 == "TRL" {exit !($2 == (NR - 2))}' file; then
  echo "success"
else
  echo "invalid"
fi

awk의 RS = ""의미는 각 레코드가 빈 줄("단락 모드"라고도 함)로 구분된다는 것입니다.

나는 처음에 그 진술에 대한 설명을 가지고 있었습니다

exit !($2 == (NR - 2))

하지만 귀하의 질문에 비슷한 코드가 있으므로 괜찮다고 가정합니다. 그래도:

  • 트레일러 레코드 개수가 유효하려면 전체 파일에 해당 개수와 헤더 및 트레일러가 정확히 포함되어야 합니다.
  • 전체 파일의 레코드 수는 awk NR 변수입니다.
  • 마이너스 2는 예고편의 카운트여야 합니다.
  • C와 마찬가지로 산술 비교 연산자는 성공하면 1을, 실패하면 0을 반환합니다.
  • 쉘은 종료 상태를 0으로 간주하여 성공을 나타내고 0이 아닌 경우 실패를 나타냅니다.
  • ==그래서 우리는 연산자의 반환 코드를 무효화합니다.

내 코드가 표시되는 레코드를 고려하지 않는다는 것을 방금 깨달았습니다.뒤쪽에예고편이 있으면 파일이 무효화될 수 있습니다. 시도해 보세요.

if awk -v RS='' '$1 == "TRL" {n = $2} END {exit !(n == NR - 2)}' file; then ...

관련 정보