awk-匹配包含大写和小写字符的字符串;小写和空格

awk-匹配包含大写和小写字符的字符串;小写和空格,awk,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

我有一个.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) 我需要检查“名称”字段中的特殊字符和数字(即,它只能是字母字符串),并且“名称”字段中的字符串长度(包括空格)不应超过30。 如果不满足上述条件,我应仅通过打印错误记录向用户报告错误

2) 我需要检查“库存编号”字段中的特殊字符,包括空格(库存编号是字母数字字段)。我还需要检查这个字段内容的长度,它不应该超过15


谁能给我一个正则表达式来满足上述要求,以及如何实现它的过程。

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

grep -viP '^[^|]* \| [a-z0-9 ]{0,30} \| [a-z0-9]{0,15} \|' file.txt
上述命令应打印所有不符合要求的行。

类似于:

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
全局和不区分大小写的regexs

在逗号分隔的值示例输入中没有一个逗号。您的问题,使示例与它支持的文本一致,并根据您的示例输入添加预期输出。为了更好地理解,我使用“sed”命令将所有逗号替换为两边都有空格的管道。它的作用相反。不要那样做。这就像是你的本田车出了问题,但是把你的丰田车带到修理工那里去诊断本田车的问题,因为你的丰田车看起来更好。当发布一个展示真实价值观的帖子时,不要做其他事情,因为这只会浪费人们的时间,因为他们没有发现不一致的地方(请参阅),最终你会得到更少的可能答案,因为我们其他人都不确定你想要什么。