ディレクトリBASHの空白を数える

Aug 24 2020

ディレクトリ内の空白文字を数えたいのですが、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

しかし、結果は非常に低く(176)、このディレクトリには1300000文字があります

回答

1 StéphaneChazelas Aug 24 2020 at 16:48

改行文字(-l)、単語(-wwcは非空白文字のシーケンスであるため、単語は空白または非文字で区切られます)、文字(-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

(バイトを文字に結合することについても同じ注意が必要です)が、GNUtrでは、シングルバイト文字に対してのみ機能することに注意してください(たとえば、UTF-8でエンコードされた非ASCII文字では機能しません)。

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

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

ただし、を使用すると-zgrepはNULで区切られたレコードで機能するため、メモリ内のテキストファイル全体が丸呑みになります(テキストファイルには通常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

前のコードは、wsvarのディレクトリにある空白文字の数を示しています

pLumo Aug 24 2020 at 16:17

試してみてくださいGNU grep

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