Unix 如果字段数不等于某个变量,则统计记录数

Unix 如果字段数不等于某个变量,则统计记录数,unix,awk,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||||

我有一个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

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

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

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

awk -F"|" -v n=5 'NF!=n{COUNT++} END{print COUNT}'   Input_file
特定于您的文件

假定

  • 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'[|]'
    避免对正则表达式或所使用的依赖选项/config的任何错误理解
  • 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*
特定于您的文件

假定

  • 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'[|]'
    避免对正则表达式或所使用的依赖选项/config的任何错误理解
  • 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*

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

$ awk -F\| '{c[NF]++} END{for(i in c) print i ":", c[i]}' file | sort
要恢复除5以外的所有数据,请将管道连接到另一个
awk

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

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

$ awk -F\| '{c[NF]++} END{for(i in c) print i ":", c[i]}' file | sort
要恢复除5以外的所有数据,请将管道连接到另一个
awk

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


请注意,从awk的角度来看,如果字段分隔符是
|
,则行
|hyrhyf | | | | fhyr |@$%|
将有七个字段(即
NF
==7)。如果你所说的字段数是指非空字段,这是一个稍有不同的问题。@jas|hyrhyf||fhyr | | fhyr |$%|将有七个字段,这里所说的NF是指非空字段以及两个字段都为空,这与记录无关。请注意,从awk的角度来看,如果字段分隔符为
|
,则行
|hyrhyf | | | fhyr |@$%
将有七个字段(即
NF
==7)。如果你说的字段数是指非空字段,那是一个稍微不同的问题。@jas|hyrhyf|fhyr|fhyr@$%|将有七个字段,这里的NF指的是非空字段以及两个字段都为空,这与记录
awk-F'|'-v num'NF无关=num{c++}END{print c}'
本应足够容易阅读-imo。我的意思是,在代码操作上有什么区别?将两个命令传送到
wc-c
并比较结果。这就是区别;)在代码级别,如果
FS
只是一个字符,则字段将由该字符分隔<在这种情况下,code>FS不是正则表达式。您不需要
[|]
。你可以简单地使用
“|”
我只是指出了你用来做一件简单事情的字符数。在awk中,简洁主要是金色的。大多数情况下,当然不总是这样。我错了,或者stackoverflow更像是一个解释代码或错误/问题的网站,而不是为自己提供最有效的代码(不像你那样做也不是问题)。这就是我的代码中这么长的评论的目的,让人们理解并适应他们的需求。
awk-F'|'-v num'NF=num{c++}END{print c}'
本应足够容易阅读-imo。我的意思是,在代码操作上有什么区别?将两个命令传送到
wc-c
并比较结果。这就是区别;)在代码级别,如果
FS
只是一个字符,则字段将由该字符分隔<在这种情况下,code>FS不是正则表达式。您不需要
[|]
。你可以简单地使用
“|”
我只是指出了你用来做一件简单事情的字符数。在awk中,简洁主要是金色的。大多数情况下,当然不总是这样。我错了,或者stackoverflow更像是一个解释代码或错误/问题的网站,而不是为自己提供最有效的代码(不像你那样做也不是问题)。这就是我的代码中这么长的评论的目的,让人们能够理解和适应他们的需求。OP是要求行数而不是行数对应吗?@NeronLeVelu:在hek2mgl编辑我的帖子之前,我编辑了ir,答案是这些行的总数不等于用户提供的字段数前面的答案(预编辑)很好:它更简单,只要通过管道输入
wc
就可以打印出行数。@linuxfan
awk'NF=n'
不是一个非常复杂的语句。如果你错过了,现在你拥有了。这里的问题是,没有一个答案明确地说:这样做,因为!这就是为什么我编辑了这个答案,因为我不想再添加一个。@hek2mgl@neronlevelu我实际上错过了问题的“仅通过awk”部分。是的,
NF!=n
并不复杂。OP要求的是行数,而不是对应的行数?@NeronLeVelu:在hek2mgl编辑我的帖子之前,我已经编辑了ir,答案是这些行的总数不等于用户提供的字段数等。上一个答案(预编辑)很好:它更简单,只需通过管道输入
wc
就可以打印出行数。@linuxfan
awk'NF=n'
不是一个非常复杂的语句。如果你错过了,现在你拥有了。这里的问题是,不属于