awk - 匹配包含上部和上部字符的字符串小写和空格

时间:2016-09-07 17:34:12

标签: awk

我有一个.csv格式的输入文件,其中包含以逗号分隔的税务发票条目。

例如:

Header--TIN | NAME | INV NO | DATE | NET | TAX | OTHERS | TOTAL
Record1-29001234768 | A S Spares | AB012 | 23/07/2016 | 5600 | 200 | 10 | 5810
Record2-29450956221 | HONDA Spare Parts | HOSS0987 |29/09/2016 | 70000 | 2200 | 0 | 72200

我的目标是使用'AWK'处理这些记录。 我的要求 -

1)我需要在'NAME'字段中查看特殊字符和数字(即它应该只是一个字母字符串),'NAME'字段中字符串的长度(包括Spaces)不应超过30。 如果不满足上述条件,我应该仅通过打印错误记录向用户报告错误

2)我需要检查'INV NO'字段以查找包括空格的特殊字符(INV NO是字母数字字段)。我还需要检查这个字段内容的长度,它不应超过15。

任何人都可以给我正则表达式来满足上述要求以及如何实现它的程序。

2 个答案:

答案 0 :(得分:2)

类似的东西:

awk -f check.awk input.csv

其中check.awk是:

BEGIN {
  FS=","  # the input field separator
}

# skip the header (NR>1), check regex for field 2, check length of field 2
NR>1 && $2 ~ /[^a-zA-Z ]/ || length($2)>30 {print "error w NAME "$1}

# skip the header (NR>1), check regex for field 3, check length of field 3
NR>1 && $3 ~ /[^0-9a-zA-Z]/ || length($3)>15 {print "error with INV NO "$1}

如果您使用gawk,则可以使用IGNORECASE全局和使用不区分大小写的正则表达式

答案 1 :(得分:0)

如果您的系统具有现代grep(即支持-P选项的系统),那么我认为使用grep更容易解决此问题,例如像这样:

grep -viP '^[^|]* \| [a-z0-9 ]{0,30} \| [a-z0-9]{0,15} \|' file.txt

上述命令应该打印所有不符合要求的行。