awk检查CSV文件中的字段是否符合某些标准

时间:2017-12-07 03:34:51

标签: awk sh

我正在尝试编写一个简单的文件健全性检查脚本。我有一个包含十几个CSV文件的目录,其中包含 id,edname,firstname,lastname,suffix,email

我喜欢写一个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

1 个答案:

答案 0 :(得分:0)

实际答案,你会发现,例如在GNU Awk在线文档的6.3.2.2 Comparison Operators中:

您可以使用

  

x!= y如果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的号码必须匹配哪种特定语法。在我的例子中,我使用了十进制整数模式,这可能不是以&#39; 0&#39;开头的。 (这也不包括数字&#39; 0&#39;)