Shell-Script

文本中最常見的詞

  • May 10, 2020

任務

這裡的參數是一個文件名!該文件包含一個文本。腳本的任務是決定哪個單詞最常包含在其他單詞中。


範例輸入和輸出

(例如文本是:play ball 足球籃球 snowball - 因此 ball 是贏家,因為它是其他三個世界的一部分)。


到目前為止我的程式碼

到目前為止我做了這段程式碼,但它並不適用於每個輸出

!/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" "

如果單詞列表在一個名為 的文件中words,每行有一個單詞(可能創建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 }'

如果沒有指定文件,腳本還會從標準輸入中讀取。

引用自:https://unix.stackexchange.com/questions/579665