열 데이터 유형 검증

열 데이터 유형 검증

특정 열이 정규식과 일치하지 않는지 확인하기 위해 awk 명령을 사용하려고 합니다. (기본적으로 저는 균일한 형식을 가진 파일의 열을 확인하고 있는데, 그렇지 않으면 오류가 발생해야 합니다. )

format=$2
col_pos=$1

val= `awk -F "|’’ -v m="$format" -v n="$col_pos" '$n ~ "^"m"$"{print $1}' sample_file.txt`

if [[ $val != "" ]]; then
   echo " column value is having unexpected format"
fi

sh sample.sh  [a-z]{8}@gmail.com 3

awk 명령에서 오류가 발생합니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요?

입력 파일:

fileid|filename|contactemail
1|file1.txt|[email protected]
2|file2.txt|[email protected]
3|file3.txt|xyz  -------->invalid column value as it doesnt satisfies the format @gmail.com 

다음은 샘플 프로그램 실행입니다(xyz가 유효한 이메일이 아니기 때문에 오류가 발생할 것으로 예상됨).

$ sh sample.sh 3 [a-z]@gmail.com
$ sh -x sample.sh 3 [a-z]@gmail.com
+ format='[a-z]@gmail.com'
+ col_pos=3
++ awk -F '~' -v 'm=[a-z]@gmail.com' -v n=3 '$n ~ "^"m"$"{print $1}' sample_file.txt
+ val=
+ [[ '' != '' ]]

답변1

여기에는 몇 가지 문제가 있습니다.

  • #!/bin/sh스크립트에 shebang을 추가했습니다. chmod +x sample.sh다음을 사용하여 실행 가능하게 만들면./sample.sh ...
  • 필드 구분 기호를 다음으로 수정합니다.'|'
  • 더 이상 사용되지 않는 명령 교체 백틱 기호를 변수 할당에서 공백 `...`문자 로 바꿉니다.$(...)
  • NR>1입력 파일의 첫 번째 줄(헤더 줄)을 건너뛰도록 추가합니다 .
  • 일치하지 않는 이메일 주소를 일치시키려면 정규식 일치를 무효화하세요.!~
  • 이중 괄호 [[...]]테스트는 유효한 구성이 아니며 다음 문자열이 비어 있지 않으면 true를 반환하는 테스트 연산자와 함께 사용되도록 sh변경되었습니다 .[...]-n

또한 오류가 발생한 위치를 확인하고 필요한 경우 다시 인쇄할 수 있도록 출력 $val에 추가했습니다 . 출력은 stderr( )로 이동하고 스크립트는 실패를 나타내기 위해 0이 아닌 종료 상태로 종료됩니다.echo$n$1>&2

수정된 스크립트:

#!/bin/sh

val=$( awk -F'|' -v n="$1" -v m="$2" 'NR>1 && $n !~ "^" m "$"{ print $n }' sample_file.txt )

if [ -n "$val" ]; then
    echo "column value is having unexpected format: $val" >&2
    exit 1
fi

예를 들어 를 사용하여 전체 필드를 및 ^와 일치시키는 경우 정규식은 이메일 주소와 일치하지 않습니다 . 가능한 쉘 해석을 방지하려면 최소한 정규식 인수를 인용하십시오.$
'[a-z][email protected]'

실행 예시:

$ ./sample.sh 3 '[a-z][email protected]'
column value is having unexpected format: xyz
$ ./sample.sh 3 'xyz'
column value is having unexpected format: [email protected]
[email protected]

답변2

@Freddy의 탁월한 답변을 바탕으로 awk입력 파일에서 발견된 오류를 STDERR에 기록한 다음 쉘이 STDERR을 로그 파일로 리디렉션하도록 할 수 있습니다 2>.할 수 있는awk필요한 경우 오류 로그 파일에 직접 쓸 수 있지만 셸을 사용하여 STDERR을 리디렉션하는 것이 더 유연합니다.

awk -F'|' -v n="$1" -v m="$2" '
    FNR>1 && $n !~ "^" m "$" {
      print NR ":" $0 > "/dev/stderr"
    }' input.txt 2> error.log

$val쉘 변수를 캡처하기 위해 STDOUT에서 오류 수를 반환하도록 할 수도 있습니다 .

#!/bin/sh

val=$(awk -F'|' -v n="$1" -v m="$2" '
        FNR>1 && $n !~ "^" m "$" {
          printf "%s:%s:%s\n", FILENAME, FNR, $0 > "/dev/stderr"
          count++
        }
        END {print count}' sample_file.txt 2> errors.log
     )

if [ "$val" != 0 ]; then
    echo "$val errors found in input:"
    cat errors.log
    exit 1
fi

예를 들어:

$ ./sample.sh 3 xyz
2 errors found in input:
sample_file.txt:2:1|file1.txt|[email protected]
sample_file.txt:3:2|file2.txt|[email protected]

참고: 입력이 STDIN에서 오는 경우 FILENAME이 awk사용되므로 -오류 로그는 다음과 같습니다.

-:4:3|file3.txt|xyz

관련 정보