나는 수많은 파일과 하위 디렉터리에서 "the"의 모든 발생을 찾아 계산하는 작은 스크립트를 작성 중입니다. 그런 다음 파일 주소와 "the"의 발생 횟수를 인쇄해야 합니다. 그러나 나는 그것을 성취하는 방법을 모른다.
find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\;
ex.sh 프로그램 이름
txt 파일 확장자
단어 발생 찾기
올바른 출력은 다음과 같아야 합니다.
./ex.sh txt the ./etext00/00ws110.txt 42764 ./etext00/1cahe10.txt 26692 ./etext00/1vkip11.txt 21895 ./etext00/2cahe10.txt 24604 ./etext00/2yb4m10.txt 15476 ./etext00/8rbaa10.txt 3131
내가 얻는 것:
./etext00/00ws110.txt 35388 ./etext00/1cahe10.txt 17905 ./etext00/1vkip11.txt 14617 ./etext00/2cahe10.txt 16971 ./etext00/2yb4m10.txt 9938 ./etext00/8rbaa10.txt 1839
나는 그것이 "the"의 모양을 포함하는 행의 수라고 가정하고 있지만 일부 행에는 "the"가 1개 이상 있을 수 있습니다.
답변1
grep -o the
생성된 행 수를 사용 하고 계산합니다.
find . -name "*.txt" -type f -printf "%p\t" \
-exec sh -c 'grep -o "the" "$0" | wc -l' {} \;
grep -o
각 라인의 각 일치 항목을 별도의 라인에 반환합니다(출력 라인당 하나의 일치 항목).
in (전체 단어 일치) 과 같이 일치 항목을 포함(대소문자 구분) 및 제외하기 위해 -wi
with를 사용할 수도 있습니다 .grep
The
the
theory
답변2
이미 GNU 확장( )을 사용하고 있으므로 -printf
GNU의 경우 awk
다음을 수행할 수 있습니다.
find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +
즉, 레코드 구분자로 사용되며 txt
각 파일을 처리한 후 레코드 수를 보고합니다. 그러나 마지막 발생 이후에 나타날 수 있는(그리고 일반적으로 나타나는) 추가 기록은 계산하지 마십시오 txt
.