Hitung item yang dibatasi dibatasi dalam file

8

Saya memiliki skrip shell yang digunakan find -print0untuk menyimpan daftar file yang akan diproses menjadi file sementara. Sebagai bagian dari pencatatan, saya ingin menampilkan jumlah file yang ditemukan, jadi saya perlu cara untuk menghitungnya. Jika -print0opsi tidak digunakan untuk keselamatan saya bisa menggunakan wc -luntuk menghitung.

qqx
sumber

Jawaban:

11

Beberapa opsi:

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

Perhatikan bahwa untuk input yang berisi data setelah karakter NUL terakhir (atau input non-kosong tanpa karakter NUL), trpendekatan akan selalu menghitung jumlah karakter NUL, tetapi pendekatan awk/ sed/ grepakan menghitung catatan tambahan untuk byte tambahan tersebut .

Stéphane Chazelas
sumber
Saya mengukur ini pada 5 GB data acak ( head -c 5G /dev/urandom > f). Hasil: grep 1.7s (sama untuk grep -Fcz '') • tr + wc-c 7.7s • tr + wc-l 7.4s • sed 34.7s • awk 1m11.7s
Socowi
@ Socowi, YMMV dengan implementasi dan lokal. Dengan GNU awk, Anda ingin mengatur lokal ke C(atau yang tidak menggunakan karakter multibyte),LC_ALL=C awk ... < f
Stéphane Chazelas
Terima kasih atas petunjuknya. Saya sudah menggunakan LC_ALL=Cdi sortmana itu tidak mempercepat, oleh karena itu Untungnya saya masih memiliki file dari sebelumnya: LC_ALL=C awk ...dibutuhkan 6.7s.
Socowi
4

Metode terbaik yang bisa saya pikirkan adalah menggunakan grep -zc '.*'. Ini berfungsi, tetapi rasanya salah menggunakan grep dengan pola yang cocok dengan apa pun.

qqx
sumber
1

Dengan perl:

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

atau:

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

atau:

perl -nle 'print scalar unpack "(Z*)*", $_'
cuonglm
sumber
Yang pertama akan menghitung catatan tambahan jika ada data setelah NUL terakhir. 2 lainnya tidak berfungsi jika input berisi karakter baris baru.
Stéphane Chazelas
@ StéphaneChazelas: Oh, salahku. Bisakah Anda memberikan perbaikan?
cuonglm
Saya hanya akan menyimpan yang pertama, dan menyebutkan fakta bahwa itu menghitung catatan tanpa batas (bertentangan dengan wc -l) sebagai catatan (seperti yang diinginkan).
Stéphane Chazelas