디렉토리의 공백 문자 수를 계산하고 싶지만 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