【问题标题】:Loop through file to count field number循环文件以计算字段编号
【发布时间】:2018-01-24 19:12:14
【问题描述】:

我有一个脚本 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,而不是文件中的每一行。

【问题讨论】:

    标签: awk


    【解决方案1】:

    在 UNIX 上,如果成功,您将返回 0,如果出现错误,则返回 !=0。对我来说,当所有记录都有 4 字段时返回 0 和当并非所有记录都有 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

    【讨论】:

    • 确实是一种优越的方法!
    • “达到完美,不是没有什么可添加的,而是没有什么可删减的。” Saint-Exupery
    • @karakfa 谢谢! :) 幸运的是 awk 的惊人设计允许编写这样的东西。
    • 感谢@EdMorton 将这些细节添加到讨论中!当然,你是对的。请不要忍受我没有将它添加到我的答案中,因为它是一种专业知识。但我会提醒自己(希望如此!:))。
    • 啊,非易失性!我已经改变了我的答案...再次感谢!
    【解决方案2】:

    你可以使用:

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

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

    【讨论】:

    • 您不需要END 块和res 变量。只需NF!=4{exit 1} 就可以了。仅当已经存在 END 块时,您才需要 res 变量机制。那是因为exit 仍将运行END 块。
    • NF!=4{exit 1} 确实反转,它返回 0 表示好的情况,1 表示坏的情况
    • 好的。也许我当时误读了这个问题。但如果是这种情况,那么 OP 可能误解了 shell 脚本中 10 的真实性。对我来说,如果所有记录都有 4 字段,则返回 1 是没有意义的。
    • 是的,现在看到了。让我们看看 OP 真的 是否想要 :)
    • @hek2mgl & anybhava OP 通过使用模棱两可/无意义的词 return 把你们俩都扔了。一个 awk 脚本不会 return 任何东西 - 它会打印一些东西并以状态退出。因此,当 OP 说 return 1 时,他是否希望脚本打印 1 或以状态 1 退出?打印时,1 表示成功,0 表示失败,退出时 0 表示成功,1 表示失败。从 OPs 代码来看,他没有使用退出状态,但恕我直言,他应该是,然后 hek2mgl 的建议是正确的 - awk 'NF!=4{exit 1}'
    【解决方案3】:

    对您的脚本进行细微的更改即可

    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 规则。
    • 打印标志并将其存储在结果中。
    • 检查结果并继续操作过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多