回答:
いくつかのオプション:
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
アプローチはそれらの余分なバイトの追加レコードをカウントします。
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
awk
では、ロケールC
(またはマルチバイト文字を使用しないもの)に設定する必要があります。LC_ALL=C awk ... < f
LC_ALL=C
たsort
ところを使っていたので、幸いにも私はまだ前のファイルを持っています:LC_ALL=C awk ...
6.7秒かかります。
とperl
:
perl -0ne 'END {print $.}'
または:
perl -nle 'print scalar split "\0"'
または:
perl -nle 'print scalar unpack "(Z*)*", $_'
wc -l
)区切られていないレコードを数えるという事実をメモとして(必要に応じて)言及します。
head
とtail
bashで、ヌルで区切られた入力に?