BASH dizinindeki boşlukları sayın

Aug 24 2020

Sadece dizindeki boşluk karakterini saymak istiyorum ama AWK komutuyla nasıl yapacağımı bulamıyorum. Şu anda bu koda sahibim

res=0
IFS="
"
cd DirPath
res2=0
res3=0
ws=0

for f in `find . ! -type d`; 
do
  let " res += `wc -l $f | awk '{print $1}'`  "
  let " res2 += `wc -c $f | awk '{print $1}'`  "
  let " res3 += `wc -w $f | awk '{print $1}'`  "
  let " ws += `wc -c $f | awk -v RS='[[:space:]]' 'END{print NR}'` "
done

ama sonuç çok düşük (176) bu dizinde 1300000 karakter varken

Yanıtlar

1 StéphaneChazelas Aug 24 2020 at 16:48

Yeni satır karakterlerinin ( -l), sözcüklerin ( -w, bunlar boşluk olmayan karakterlerinwc dizileridir , bu nedenle sözcükler boşluk veya karakter olmayanlarla sınırlandırılır), karakterler ( ) ve bayt ( ), şunları yapabilirsiniz:-m-c

find . -type f -exec cat {} + | wc -lwmc

Ancak , dosyaları birleştirdiğinden, boşluk karakteriyle bitmeyen dosyalar varsa (metin dosyaları bir boşluk karakteri olan yeni satır karakteriyle bitmelidir) kelimecat ve karakter sayısı için yanlış sonuçlar verebileceğini unutmayın. örneğin iki baytın tek bir geçerli karakterde birleştirilmesiyle veya iki kelimenin bir araya getirilmesiyle sonuçlanabilir.

Örnek vermek:

$ od -tx1 a 0000000 c3 0000001 $ od -tx1 b
0000000 a9
0000001
$ wc -m a b 0 a 0 b 0 total $ cat a b | wc -m
1
$ printf foo > a $ printf bar > b
$ wc -w a b 1 a 1 b 2 total $ cat a b | wc -w
1

Boşluk karakterlerini POSIX olarak saymak için şunları yapabilirsiniz:

find . -type f -exec cat {} + | tr -cd '[:space:]' | wc -m

(baytları karakterlere birleştirme konusunda aynı uyarıyla), ancak GNU ile trbunun yalnızca tek baytlık karakterler için çalıştığını unutmayın (örneğin UTF-8 ile kodlanmış ASCII olmayan karakterler için geçerli değildir).

GNU sistemlerinde GNU'ya başvurabilir ve şunları grepkullanabilirsiniz:

grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c

-z, ile NUL ile ayrılmış kayıtlar üzerinde çalıştığından, bunun tüm metin dosyalarının bellekte kaymasına neden olacağını unutmayın grep(metin dosyaları genellikle NUL baytları içermediğinden).

ApoSkunz Aug 24 2020 at 16:31
cd DIRPATH
res2=0
res3=0
ws=0
let " ws += `grep -rzo '[[:space:]]' . | LC_ALL=C tr -cd '\0' | wc -c` "

for f in `find . ! -type d`; 
do
let " res += `wc -l $f | awk '{print $1}'`  "
let " res2 += `wc -c $f | awk '{print $1}'`  "
let " res3 += `wc -w $f | awk '{print $1}'`  "
done

Önceki kod size ws var dizinindeki boşluk karakteri sayısını verir.

pLumo Aug 24 2020 at 16:17

Şununla deneyin GNU grep:

grep -ro '[[:space:]]' | wc -l