特定の文字で終わる単語数の計算

特定の文字で終わる単語数の計算

私が読んでいるディレクトリには本のリストがありますが、本の中の特定の文字の小文字と大文字で終わるすべての単語をリストしたいと思います。

おそらくcutまたはtrを使用してこれを行う方法があります。しかし、私はそれを理解することはできません。パイプ内でglobを使用してこれを達成する方法はありますか?

grep、sed、awk、perl は使用できません。

編集:私が得た最も近いものは次のとおりです。

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

これにより、1行に1つずつすべての単語のリストを取得できます。実際に重複項目を削除する必要はありません。これで、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.1つの単語と3つの単語になります。
  • 実装が文字を正しく処理しても、分解された形式(急音アクセントを組み合わせたU + 0301が後に続く)で書かれている場合は、2秒として計算されますeSté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
  }

おすすめ記事