특정 문자로 끝나는 단어 수 계산

특정 문자로 끝나는 단어 수 계산

내가 읽고 있는 디렉토리에 책 목록이 있는데, 책에서 특정 문자의 소문자와 대문자로 끝나는 모든 단어를 나열하고 싶습니다.

아마도 cut이나 tr을 사용하여 이를 수행할 수 있는 방법이 있을 것입니다. 그러나 나는 그것을 알아낼 수 없습니다. 파이프 내부에서 glob을 사용하여 이를 달성할 수 있는 방법이 있습니까?

grep, sed, awk 또는 perl을 사용할 수 없습니다.

편집: 내가 얻은 가장 가까운 것은 다음과 같습니다.

cat * | tr '[:punct:]' ' '| tr ' ' '\n' | tr -s '\n'| tr '[:upper:]' '[:lower:]' | rev | sort

이렇게 하면 한 줄에 하나씩 모든 단어 목록을 얻을 수 있습니다. 실제로 중복 항목을 제거할 필요는 없습니다. 이제 q로 시작하는 단어만 필터링하면 됩니다.

답변1

다음을 수행할 수 있습니다.

< book.txt \
  tr -sc '[:alnum:]_-' '[\n*]' |
  tr -d - |
  rev |
  cut -c1 |
  tr -cd eE |
  fold -w1 |
  sort |
  uniq -c

단어 끝에서 es 및 s(여기서는 영숫자, 밑줄 또는 하이픈의 시퀀스로 정의됨)를 계산하지만 몇 가지 제한 사항에 유의하세요.E

  • 많은 구현(GNU 구현 포함)은 단일 바이트 문자로만 작동합니다.
  • rev, 하지만 common은 표준 명령이 아닙니다.
  • USAU.S.A.한 단어와 세 단어 가 될 것입니다 .
  • 구현에서 문자를 올바르게 처리하더라도 분해된 형식(급음 악센트를 결합한 U+0301이 뒤따름)으로 작성된 경우 2초로 계산됩니다 e.Stéphaneée
  • 하이픈을 처리하지 않습니다.
  • e1.02e+23 또는 0xffe.5fp-4로 계산됩니다...

POSIX 셸 및 유틸리티로 제한된 경우 다음을 사용할 수도 있습니다 ed.

ed -s book.txt << 'EOF' | sort | uniq -c
g/[^[:alnum:]_-]\{1,\}/s//\
/g
g/-/s///g
g/.*\(.\)$/s//\1/
v/[eE]$/d
,p
Q
EOF

또는 다음을 사용하여 sh:

l=0 u=0
< book.txt \
  tr -sc '[:alnum:]_-' '[\n*]' | {
    while IFS= read -r word; do
      word=${word%"${word##*[!-]}"}
      case $word in
        (*e) l=$((l + 1));;
        (*E) u=$((u + 1));;
      esac
    done
    printf '%s\t%s\n' "$l" e "$u" E
  }

관련 정보