仕事

仕事

仕事

ここでパラメータはファイル名です!ファイルにテキストが含まれています。スクリプトの使命は、どの単語が最も頻繁に含まれるか(つまり)決定することです。


入出力例

(たとえば、テキストはボール、サッカー、バスケットボール、雪玉です。したがって、ボールは他の3つの世界の一部であるため、勝者になります。)


これまで私のコード

これまでこのコードを書いていますが、すべての出力に対して機能するわけではありません。

!/bin/sh
awk '{for(i=2;i<NF;i++) {s=$i; for(j=i+1;j<=NF;j++) print s=s FS $j}}' $1 | sort | uniq -c | sort -k1,1rn -k2 | sed 's/ *[^ ]* *//;q' | cut -f1 -d" "

ベストアンサー1

words単語リストが1行に1単語しかないファイルにある場合(元のリストをtr ' ' '\n' <originalwords >words複数行に分割するために作成された可能性がある)、ループを実行します。

while IFS= read -r word; do
    grep -F -o -e "$word" words
done <words | awk '{ c[$0]++; if (c[$0] > c[w]) w = $0 } END { print w }'

単語リストの一部として最も頻繁に表示される単語を出力します(または、多くの単語が同じ回数で表示される場合は、リスト内のその単語が最初に表示される単語)。

これは、リスト自体をリストと一致させる一連のパターンとして使用します。-o一致する部分文字列を別の行に返す必要があります。

ループ単独の出力と質問に提供されているリストは次のとおりです。

play
ball
ball
ball
ball
football
basketball
snowball

次に、単語数を数えて最も頻繁に表示される単語を選択します。


一時ファイル処理を含む完全なスクリプト:

#!/bin/sh

tmpfile=$(mktemp)

trap 'rm -f "$tmpfile"' EXIT      # delete temporary file upon exiting

tr -s ' ' '\n' <"${1:-/dev/stdin}" >"$tmpfile"  # convert into word list

while IFS= read -r word; do
    grep -F -o -e "$word" "$tmpfile"
done <"$tmpfile" | awk '{ c[$0]++; if (c[$0] > c[w]) w = $0 } END { print w }'

ファイルを指定しないと、スクリプトは標準入力からも読み取られます。

おすすめ記事