Unix 如果字段数不等于某个变量,则统计记录数
我有一个csv文件,我想统计没有NF(字段数)等于某个数字的记录数 我试过了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||||
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
注:
- 使用
避免对正则表达式或所使用的依赖选项/config的任何错误理解-F'[|]'
是批处理变量,包含被排除的字段数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
注:
- 使用
避免对正则表达式或所使用的依赖选项/config的任何错误理解-F'[|]'
是批处理变量,包含被排除的字段数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
就可以打印出行数。@linuxfanawk'NF=n'
不是一个非常复杂的语句。如果你错过了,现在你拥有了。这里的问题是,没有一个答案明确地说:这样做,因为!这就是为什么我编辑了这个答案,因为我不想再添加一个。@hek2mgl@neronlevelu我实际上错过了问题的“仅通过awk”部分。是的,NF!=n
并不复杂。OP要求的是行数,而不是对应的行数?@NeronLeVelu:在hek2mgl编辑我的帖子之前,我已经编辑了ir,答案是这些行的总数不等于用户提供的字段数等。上一个答案(预编辑)很好:它更简单,只需通过管道输入wc
就可以打印出行数。@linuxfanawk'NF=n'
不是一个非常复杂的语句。如果你错过了,现在你拥有了。这里的问题是,不属于