计算文件中的nul个分隔项


Answers:


11

一些选项:

tr -cd '\0' | wc -c

tr '\n\0' '\0\n' | wc -l      # Generic approach for processing NUL-terminated
                              # records with line-based utilities (that support
                              # NUL characters in their lines like GNU ones).

grep -cz '^'                  # GNU grep

sed -nz '$='                  # recent GNU sed, no output for empty input

awk -vRS='\0' 'END{print NR}' # not all awk implementations

请注意,对于包含最后一个NUL字符之后的数据的输入(或没有NUL字符的非空输入),tr方法将始终计算NUL字符的数量,但是awk/ sed/ grep方法将为这些额外字节计算一条额外记录。


我在5 GB的随机数据(head -c 5G /dev/urandom > f)上进行了测量。结果: grep 1.7s(相同grep -Fcz '')•tr + wc-c 7.7s•tr + wc-l 7.4s•sed 34.7s•awk 1m11.7s
Socowi

@ Socowi,YMMV及其实现和语言环境。使用GNU时awk,您需要将语言环境设置为C(或任何不使用多字节字符的语言环境),LC_ALL=C awk ... < f
StéphaneChazelas

感谢您的提示。我已经LC_ALL=Csort无法加快速度的地方使用过,因此幸运的是我仍然有以前的文件:LC_ALL=C awk ...需要6.7秒。
Socowi

4

我想到的最好的方法是使用grep -zc '.*'。这可以工作,但是将grep与可以匹配任何内容的模式一起使用会感到错误。


1

perl

perl -0ne 'END {print $.}'

要么:

perl -nle 'print scalar split "\0"'

要么:

perl -nle 'print scalar unpack "(Z*)*", $_'

如果在最后一个NUL之后有数据,则第一个记录将增加一条记录。如果输入中包含换行符,则另外两个无效。
斯特凡Chazelas

@StéphaneChazelas:哦,我的天哪。你能有所改善吗?
cuonglm 2014年

我只保留第一个记录,并提及一个事实,即该记录将不定界记录(与相反wc -l)记为便笺(可能需要)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.