2016-09-21 40 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