web-dev-qa-db-ja.com

ターミナルを使用して、txtファイルで最も頻繁に使用されるn個の単語を検索しますが、猫「grep」を使用します。およびtr-d "/ r"コマンド

テキストファイルでnの最も一般的な単語を見つけたいのですが、次の条件があります。

  • catファイルを取得します。
  • grep .単語を取得します。
  • tr -d '/r'新しい行を削除します。

コードの後半を|sort | uniq -c | sort -nr| head -10で動作させることができました。

1
Lucas

grepの使用についておっしゃっていますが、最も頻繁に使用される単語を見つけることが目標である場合、その必要性はあまりわかりません。多くの場合、テキストファイルを単語に分割してから、| sort | uniq -c | sort -nr | head -10パイプラインを実行します。

すぐに頭に浮かぶ解決策(間違いなく多くの代替解決策があります)は、sedを介して正規表現を使用することです。

sed 's/\s/\n/g'

これは、すべての空白文字(\s)を単一の改行(\n)に置き換えることを示しています。一緒に組み合わせると、あなたのソリューションは次のようになると思います。

cat [file] | sed 's/\s/\n/g' | sort | uniq -c | sort -nr | head -10 | awk '{print $2}'

最後のawk '{print $2}'に追加して、単語のみを表示します(カウントは表示しません)が、これはスクリプトの目的に完全に依存します。

1
Jason K Lai

これは宿題のように聞こえます。

catgrep、およびtrのすべての要件に従い、大文字と小文字(HE = He = he = hE)、および句読点で終わる単語(HE = He = he = hE)に一致します。 he。= he = he、= he!):

for Word in $(
  cat derp.txt | \
  tr '[:upper:]' '[:lower:]' | \
  tr -d '[:punct:]' | \
  tr -d '/r'
)
do
  words[$Word]=$(cat derp.txt | grep -c $Word)
  echo "${words[$Word]} $Word" # lots of duplicate output that's filtered out below.
done | sort -u | tail -n 10

grep .すべてに一致するので、タイプミスですか?

tr -d '\r'は、このコンテキストでは無意味です。IFSループの入力フィールドセパレータforは、空白と改行の両方を区切り文字として扱うためです。

Jason KLaiのソリューションがおそらく最良です。

1
SHawarden