循环文件以计算字段编号

时间:2018-01-24 19:12:14

标签: awk

我有一个脚本bash来从.txt文件添加用户。 这很简单:

name firstname uid gid

空格分隔值

我想用awk检查每行是否包含4个字段。如果是,我想返回1,如果不返回0。

file=/my/file.txt
awk=$(awk -F' ' '{(NF != 4) ? res = 0 : res = 1; print res)}' $file)
echo $awk

现在,awk每行返回1,但我希望它最后返回1或0,而不是文件中的每一行。

3 个答案:

答案 0 :(得分:6)

在UNIX上,如果成功,您将返回0,如果出现错误,则返回!=0。对我来说,当所有记录都包含0字段时返回4更有意义,而当所有记录都有4个字段时返回1更为合理。

要实现这一目标,请使用exit

awk 'NF!=4{exit 1}' file

仅供参考:awk默认会以0退出。

如果你想在shell条件中使用它:

#!/bin/bash
if ! awk 'NF!=4{exit 1}' file ; then
    echo "file is invalid"
fi

PS:您的示例中的-F' '是多余的,因为' 'default field delimiter

答案 1 :(得分:3)

您可以使用:

awk 'res = NF!=4{exit} END{exit !res}' file

如果所有行都有4列,则会以1退出,否则它将与0

一起存在

答案 2 :(得分:0)

对脚本进行细微更改

result=$(awk -F' ' 'BEGIN{flag=1}NF!=4{flag=0;exit}END{print flag}' "$file")
[ ${result:-0} -eq 0 ] && echo "Problematic entries found in file"

方法

  • 将标志设置为1,希望每条记录包含4个字段。
  • 检查记录是否实际包含4个字段,如果未将标志设置为零并退出。
  • exit将跳过其余输入并转到END规则。
  • 打印标志并将其存储在结果中。
  • 检查结果并继续执行行动课程。