ディレクトリBASHのスペース数の計算

ディレクトリBASHのスペース数の計算

ディレクトリ内の空白文字の数を計算したいのですが、AWKコマンドの使用方法が見つかりませんでした。現在私はこのコードを持っています

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

しかし、このディレクトリに1300000文字がある間、結果は非常に低いです(176)。

答え1

-l改行()、単語()の数を数えます-w。ここでは、wc空白ではなくシーケンスです。数値したがって、単語はスペースまたは非文字)、文字(-m)、およびバイト(-c)で区切られます。次のようにできます。

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

ただし、ファイルの関連付けによってcatスペースで終わらないファイルがある場合は、誤った単語と文字の計算結果が表示されることがあります。特徴(テキストファイルは空白文字の改行で終わる必要があります。)これは、2バイトを1つの有効な文字に連結するか、2つの単語を一緒に連結する可能性があるためです。

例:

$ 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

空白文字を計算するには、POSIXlyで次のことができます。

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

(再び、バイトを文字で連結するには注意が必要です。)しかし、GNUではtrこれは単一バイト文字でのみ機能することに注意してください(したがって、UTF-8でエンコードされた非ASCII文字は該当しません)。

GNUシステムでは、GNUを使用して以下をgrep使用できます。

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

ただし、NULで区切られたレコードで機能するため、-z最終的にgrepメモリ内のフルテキストファイルを占有します(テキストファイルは通常NULバイトを含まないためです)。

答え2

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

上記のコードは、ws varディレクトリの空白文字の数を提供します。

答え3

以下を試してくださいGNU grep

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

関連情報