如果没有,则计算没有记录。字段不等于某个变量

时间:2017-02-01 06:33:32

标签: unix awk

我有一个csv文件,我想要计算没有NF(没有字段)等于某个数字的记录,

我试过了

nawk '{print NF}' FS='|' "$CSVFILE" | grep "$Variable" | nawk '{print $1}' | sort | uniq -c

此处CSVFILE是任何CSV文件 和变量是用户除了查找文件是否包含没有字段的任何随机数

有什么方法我只能通过awk

来使用它

示例输入文件

dsdgh||@jhsjdh||jdhjdhfu|123|
#45ghf|123|laiej||||
|hyrhyf|||fhyr|@#$%|

假设我想检查有多少记录没有不等于5的字段

所以预期输出应为3,因为所有3个记录的NF都小于或大于5

3 个答案:

答案 0 :(得分:2)

NF不等于n时增加点数并在结尾打印计数:

awk -F"|" -v n=5 'NF!=n{COUNT++} END{print COUNT}'   Input_file

答案 1 :(得分:1)

特定于您的文件

假设

  • VarNumber是一个有效的整数(不是保护此请求的一部分)
  • 文件存在且可以重新编辑

评论代码

awk -F '[|]' -v NotEqualTo="${VarNumber}" '
   # if record have number of field NOT equal to given number
   NF != NotEqualTo {
      # Count the line
      c++
      }

   # at end of file
   END {
     # print the count (only)
     print c
     }
   ' YourFile

注意:

  • 使用-F '[|]'来避免使用RegEx或依赖选项/配置的任何误解
  • VarNumber是批量变量,其中包含您要排除的字段数

许多文件的通用

awk -F '[|]' -v NotEqualTo="${VarNumber}" '
   # Count if NF is NOT the number given and put info in array
   # 1 entry by file name
   NF != NotEqualTo {c[FILENAME]++}

   # at end of file, print the count (only) for each file (eement of array)
   END { for( f in c) print f " : " c[f] }
   ' YourFiles*

答案 2 :(得分:1)

这将为您提供完整的字段数分布

$ awk -F\| '{c[NF]++} END{for(i in c) print i ":", c[i]}' file | sort

恢复所有但是等于5,管道到另一个awk

$ ... |  awk '!/^5:/{sum+=$2} END{print sum}'