Conta gli spazi bianchi nella directory BASH

Aug 24 2020

Voglio solo contare i caratteri degli spazi bianchi nella directory ma non trovo come fare con il comando AWK. Attualmente ho questo codice

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

ma il risultato è molto basso (176) mentre ho 1300000 caratteri in questa directory

Risposte

1 StéphaneChazelas Aug 24 2020 at 16:48

Per contare il numero di caratteri di nuova riga ( -l), parole ( -w, che per sono sequenze di caratteriwc non spazi bianchi , quindi le parole sono delimitate da spazi bianchi o non caratteri), caratteri ( ) e byte ( ), puoi fare:-m-c

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

Tuttavia, poiché catconcatena i file, potrebbe fornire risultati errati per il conteggio di parole e caratteri se ci sono file che non terminano con uno spazio bianco (i file di testo dovrebbero terminare con un carattere di nuova riga, che è un carattere di spazio bianco) come quello potrebbe finire per unire due byte in un carattere valido, ad esempio, o unire due parole insieme.

Esempio:

$ 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

Per contare i caratteri degli spazi bianchi, POSIXly, potresti fare:

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

(con lo stesso avvertimento sull'unione di byte in caratteri), ma nota che con GNU tr, funziona solo per caratteri a byte singolo (quindi non caratteri non ASCII con codifica UTF-8, ad esempio).

Sui sistemi GNU, puoi ricorrere a GNU grepe usare:

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

Tuttavia, si noti che poiché con -z, grepfunziona su record delimitati da NUL, ciò finirebbe per assorbire interi file di testo in memoria (poiché i file di testo in genere non contengono byte NUL).

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

Il codice precedente ti fornisce il numero di spazi bianchi nella directory su ws var

pLumo Aug 24 2020 at 16:17

Prova con GNU grep:

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