我正在尝试编写一个简单的文件健全性检查脚本。我有一个包含十几个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
答案 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;)