2016-09-07 7 views
1

入力ファイルにはカンマで区切られた税インボイスのエントリを含む.csv形式の入力ファイルがあります。例えばawk - 大文字と小文字と空白の両方の文字を含む文字列に一致します

Header--TIN | NAME | INV NO | DATE | NET | TAX | OTHERS | TOTAL 
Record1-290| 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'フィールドに特殊文字と数字(つまり、アルファベット文字のみである必要があります)と文字列の長さ(スペースを含む)を確認する必要があります 上記の条件が満たされない場合は、エラーレコードのみを印刷してエラーを報告してください。

2)空白を含む特殊文字の場合は、「INV NO」フィールドをチェックする必要があります(INV NO英数字フィールドです)。また、このフィールドの内容の長さを確認する必要がありますし、15を超えてはいけません。

上記の要件を満たす正規表現とそれを実装する手順も教えてください。

+0

大文字と小文字を区別しないregexsを使用します。check.awkがある

awk -f check.awk input.csv 

カンマ区切り値のサンプル入力でカンマを入力します。あなたの質問を編集して、それがサポートするテキストと一致するようにして、サンプル入力が与えられたときに期待される出力を追加してください。 –

+0

「sed」コマンドを使用して、わかりやすいように、すべてのカンマを両側のスペースでパイプラインに置き換えました。 –

+0

それは逆です。それをしないでください。それはあなたのホンダに問題があるようですが、あなたのトヨタがより良く見えるので、ホンダの問題を診断するためにトヨタをメカニックに連れて行くことです。 [mcve]で実際の値を表示すると、それ以外のものでは不一致が見つからない人の時間が無駄になり(http://stackoverflow.com/a/39376233/1745001参照)、結果的に可能な答えは私たちの残りの部分があなたが何を望んでいるか分からない。 –

答えて

2

のような何か:

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グローバルを使用することができますし、単一ありません

0

ご使用のシステムに最新のgrep(つまり、-Pオプションをサポートするもの)がある場合は、grepを使用してこれを解決する方が簡単でしょう。

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

上記のコマンドは、要件を満たしていないすべての行を出力します。

関連する問題