固定宽度文件中的字段提取和验证格式

固定宽度文件中的字段提取和验证格式

我正在为固定宽度文件编写一个 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 变量;然后你会看到我们将 1 添加到 RSTART 中,成为 startPos 的 16,并从 RLEGNTH 中扣除 2 成为 13 以进行 len 检查。

输入:

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 的邮件,请将两个比较运算符替换为==

相关内容