2017-12-07 10 views
-1

シンプルなファイルサニティチェックスクリプトを作成しようとしています。 id、edname、firstname、lastname、suffix、emailを含む12個のCSVファイルがあるディレクトリがあります。awkはCSVファイルのフィールドを特定の条件で指定します。

最初のフィールドに数字が含まれていて空でないかどうかを確認するawkスクリプトを書いています。フィールド番号3,4 & 6が空ではなく、ファイルに6以上のフィールドが6以上含まれていない場合、これらの条件がすべて成立しても何も起こりませんが、これらの条件のいずれかが失敗した場合は、ファイル名を.badに変更してください。ここまで私が行ったことがあります。

for f in *.csv; do 
    awk -F, '{ exit (NF ==6 ? 0:1) }' "$f" && echo mv "$f" "${f}.bad" 
done 

答えて

0

実際の回答は、 xは、フィールドが空でない場合を比較するには、y

と等しくない場合はGNU Awkのオンラインドキュメントの6.3.2.2 Comparison Operators

にあなたは真の

のx!= yのを使用することができます。

文字列xが、それは特定のパターンに一致するかどうかを確認するには、y

で示される正規表現に一致する場合には、

のx〜yの真を使用することができます。

それぞれ延長あなたのawkスクリプト:

{ exit (NF==6 && $1~/[1-9][0-9]*/ && $3!="" && $4!="" && $6!="") ? 0 : 1 } 

小さなデモ:もちろん

$ cat >good.txt <<'EOF' 
1,edname,firstname,lastname,suffix,email 
2,edname,firstname,lastname,suffix,email 
EOF 

$ cat >bad_nr_fields.txt <<'EOF' 
> 1,edname,firstname,lastname,suffix 
> EOF 

$ cat >bad_id.txt <<'EOF' 
> A,edname,firstname,lastname,suffix,email 
> EOF 

$ cat >bad_firstname.txt << 'EOF' 
> 1,edname,,lastname,suffix,email 
> EOF 

$ for FILE in good.txt bad_nr_fields.txt bad_id.txt bad_firstname.txt; do 
> echo $FILE":" 
> if awk -F, '{ exit (NF==6 && $1~/[1-9][0-9]*/ && $3!="" && $4!="" && $6!="") ? 0 : 1 }' "$FILE"; then echo "good" 
> else echo "bad" 
> fi 
> done 
good.txt: 
good 
bad_nr_fields.txt: 
bad 
bad_id.txt: 
bad 
bad_firstname.txt: 
bad 

$ 

、私は一致する必要がありidため、どの特定の構文あなたの番号がわかりません。私の場合、「0」で始まらない10進整数のパターンを使用しました。 (これには数字「0」も含まれません)

関連する問題