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