Shell-Script
文本中最常見的詞
任務
這裡的參數是一個文件名!該文件包含一個文本。腳本的任務是決定哪個單詞最常包含在其他單詞中。
範例輸入和輸出
(例如文本是: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 }'
如果沒有指定文件,腳本還會從標準輸入中讀取。