디렉토리 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공백으로 끝나지 않는 파일이 있는 경우 잘못된 단어 및 문자 계산 결과가 나타날 수 있습니다.특징(텍스트 파일은 공백 문자인 개행으로 끝나야 합니다.) 이는 두 바이트를 하나의 유효한 문자로 연결하거나 두 단어를 함께 연결하게 될 수 있기 때문입니다.

예:

$ 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

관련 정보