고정 너비 파일의 필드 추출 및 유효성 검사 형식 [닫기]

고정 너비 파일의 필드 추출 및 유효성 검사 형식 [닫기]

특정 필드를 추출하고 해당 형식을 확인하기 위해 고정 너비 파일에 대한 poc를 작성 중입니다. 그러나 둘 다 나에게 확인 실패를 안겨주었습니다. 이 점을 지적하도록 도와주실 수 있나요?

코드에서 이메일 ID를 빼고 공간을 자르고 형식을 확인하려고 합니다.

암호

awk -v m=16 -v p=13 -v 'n=[a-z][email protected]' '
{ 
  c=substr($0,m,p)
  sub(" +$", "", c)
  c !~ "^" n "$"
  printf "%s:%s:%s\n", FILENAME, FNR, $0> "/dev/stderr"
  count++
}
END {print count}' BNC_fixedwidth.txt

입력 파일

10027  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125

답변1

이건 어때?

awk -v startPos=16 -v len=13 -v pat='[[:blank:]][a-z]+@gmail\\.com[[:blank:]]' '
{ match($0, pat);
  if (RSTART+1>=startPos && RLENGTH-2<=len){ print; "or do whatever you want..." }
}' infile

[[:blank:]]가장자리의 단일 공백/탭과 일치하도록 메일 정규식의 시작과 끝에 추가했습니다.pat, 따라서 [[:blank:]]함수와 일치하면 startPos가 15로 설정되고 len이 15로 설정됩니다(길이에 두 개의 추가 문자로 인해 첫 번째 문자가 마지막임) match(). 일치하는 항목이 발견되면 awk는 RSTART 및 RLENGTH 변수를 설정하면 RSTART에 1을 더해 startPos의 경우 16이 되고 RLEGNTH에서 2를 빼서 len 검사의 경우 13이 되는 것을 볼 수 있습니다.

입력하다:

11111  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
22222  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333  20033t   [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
44444  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
55555  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
66666  20033t [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
88888  20033t  @gmail.com 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125

산출:

11111  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333  20033t   [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777  20033t  [email protected] 19519  11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125

위치 16에서 시작하고 길이가 13인 메시지를 엄격하게 일치시키려면 두 비교 연산자를 모두 로 바꾸십시오 ==.

관련 정보