2016-09-21 157 views
1

我有一个.csv格式的输入文件,其中包含由管道分隔的税务发票条目。awk - 仅匹配正整数和浮点数

例如:

Header--TIN | NAME | INV NO | DATE | NET | TAX | OTHERS | TOTAL 
Record1-290| A S Spares | AB012 | 23/07/2016 | 5600.25 | 200.70 | 10.05 | 5811.00 
Record2-29450956221 | HONDA Spare Parts | HOSS0987 |29/09/2016 | 70000 | 2200 | 0 | 72200 

记录的净值,税务价值,其他费用和总价值列可能包含正整数或正浮点数小数点后2-4位。

现在我的要求是通过检查相应的'正则表达式使用awk'来检查列是否满足指定的约束条件。 我需要使用正则表达式匹配这4列,如果我遇到除正整数或正浮点数以外的任何数值,我需要向用户打印一条错误消息。

我试过以下,但它似乎没有工作。

if(!($5 ~ /[0-9]+/) || !($5 ~ /[0-9]+[.][0-9]+/) || ($5<=0)) 
    { printf("NET VALUE (Violates constraints)" } 

任何人都可以给正确的工作正则表达式或任何使用内置函数的实现来满足我的要求吗?

+0

不要忘记,如果正则表达式在正在测试的字段中出现__anywhere__,那么'〜'运算符将返回true。例如:'awk'BEGIN {if(“abc8xyz”〜/ [0-9] + /)print“这是一个提示吗?” }'' – jas

+0

您的发布输入文件中没有逗号,因此显然不是CSV。 [编辑]你的问题要么向我们展示真正的CSV输入文件,要么删除有关CSV的讨论,如果这是你真正的输入格式。 –

+0

@Ed Morton - 我已经使用sed命令来替换所有的管道逗号以便更好地理解。它当然是一个.csv文件,它是通过使用libreoffice转换.ods文件而获得的,但是用管道替换了逗号。 –

回答

1

听起来像是你的验证应该是:

$5 ~ /^[0-9]+(\.[0-9]{2,4})?$/ 

如果匹配,那么它是有效的(一个正整数,或者一个数字,后跟.和2个至4其他数字)。

锚地的开始和结束的领域是重要的!

正如在评论中指出的那样,如果你想接受小数点前没有数字的数字,那么你将不得不去寻找更复杂的正则表达式。

+0

Oh..Sorry ...我在记录中的管道和值之间没有空间。 –

+0

@Shreyas注意到我的模式中有一个拼写错误(一个额外的括号),我已编辑删除。 –

+0

@TomFenech:我试过这个'echo“345.23”| awk'{if($ 0〜/^[0-9]+(\.[0-9]{2,4})?$/)print“good”}''并且它不起作用。它适用于没有小数点的数字 – Fazlin