awk检查CSV文件中符合特定条件的字段

awk检查CSV文件中符合特定条件的字段,awk,sh,Awk,Sh,我正在尝试编写一个简单的文件健全性检查脚本。我有一个包含十几个CSV文件的目录,其中包含id、edname、firstname、lastname、后缀、email 我喜欢编写一个awk脚本来检查第一个字段是否包含一个数字并且不是空的。编号为3、4和6的字段不为空,并且文件包含的6个字段不超过6个,如果所有这些条件均为真,则不会发生任何情况,但如果其中任何条件失败,则将文件重新命名为.bad。以下是我迄今为止所做的工作 for f in *.csv; do awk -F, '{ exit

我正在尝试编写一个简单的文件健全性检查脚本。我有一个包含十几个CSV文件的目录,其中包含id、edname、firstname、lastname、后缀、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

您可以在GNU Awk在线文档中找到实际答案:

你可以用

x!=如果x不等于y,则y为真

如果字段不为空,则进行比较

你可以用

如果字符串x与由y表示的regexp匹配,则x~y为True

检查它是否匹配某个模式

您的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

$
$cat>good.txt bad\u id.txt EOF
$cat>bad_firstname.txt 1,edname,,lastname,后缀,email
>EOF
$good.txt bad_nr_fields.txt bad_id.txt bad_firstname.txt中的文件;做
>echo$文件“:”
>如果awk-F,“{exit(NF==6&&$1~/[1-9][0-9]*/&$3!=”“&&$4!=”“&&$6!=”)?0:1}'”$FILE”;然后回应“好”
>否则我会说“坏”
>fi
>完成
good.txt:
好的
错误的\u nr\u fields.txt:
坏的
错误的\u id.txt:
坏的
错误的\u firstname.txt:
坏的
$
当然,我不知道您的id号的具体语法必须匹配。在我的例子中,我使用了十进制整数的模式,它不能以“0”开头。(这也不包括数字“0”。)