我想訂購計算與多個并發文本匹配的匹配度的結果。我想計算部分匹配到文本搜索的搜索集合,例如元音、雙字母、前綴。
我想使用 bash、awk、命令列工具或單行工具,而無需撰寫其他腳本。
例如,假設我想按每個單詞中的元音數量排序
$ shuf --random=/usr/share/dict/words -n 10 /usr/share/dict/words | sort
Ianus
adulation
agomensin
autologist
avellaneous
granulose
lanced
minkery
outpreen
overhysterical
我要輸出
7 overhysterical
7 avellaneous
6 autologist
6 adulation
5 outpreen
5 granulose
5 agomensin
4 minkery
3 lanced
3 Ianus
(請更新問題以添加此問題的其他措辭)
uj5u.com熱心網友回復:
對于“按元音數量排序”的特定問題,GNU awk 是一個不錯的選擇:
produce_words |
gawk '
{
vowels = gensub(/[^aeiouy]/, "", "g", tolower($0))
count[$0] = length(vowels)
}
END {
PROCINFO["sorted_in"] = "@val_num_desc"
for (word in count) print count[word], word
}
'
有關PROCINFO 魔法,請參閱使用 gawk 使用預定義的陣列掃描順序。
uj5u.com熱心網友回復:
用于perl計算元音:
$ cat input.txt | perl -ne 'print lc =~ tr/aeiouy//, "\t", $_' | sort -k1,1nr
6 avellaneous
6 overhysterical
5 adulation
5 autologist
4 agomensin
4 granulose
4 outpreen
3 Ianus
3 minkery
2 lanced
shuf用您或您正在使用的任何行源替換無用的 Cat使用。
該lc =~ tr/aeiouy//位在輸入的小寫版本中用自己替換元音(為了避免更麻煩tr/aeiouyAEIOUY//)并回傳替換的數量。那是列印出來的,加上一個選項卡和該行的內容。然后sort用于,呃,排序。不過,我不確定您是如何獲得示例中的元音數量的。
uj5u.com熱心網友回復:
awk 可以做到這一點。
一個相關的問題很簡單,計算匹配某些模式的行數:
| awk '/c/{tot[$0] } /t/{tot[$0] } /v/{tot[$0] } END{for (i in tot) print tot[i],i }' | sort -rn.
$ sed -n 200,203p /usr/share/dict/words | awk '/c/{tot[$0] } /t/{ tot[$0] } /v/{tot[$0] } END{for (i in tot) print tot[i],i }' | sort -rn
3 abevacuation
1 abettor
1 abettal
1 abetment
要解決整個問題,計算每行中的匹配數有點棘手。如果它們全部或部分不相互包含,例如,按元音計數排序:
... | awk '{ split($0,a,"a|e|i|o|u|y"); arr[$0] =length(a)-1 } END { for (e in arr) print arr[e],e}' | sort -rn
$ ... |
awk '{ split($0,a,"a|e|i|o|u|y"); arr[$0] =length(a)-1 }
END { for (e in arr) print arr[e],e}' |
sort -rn
從 1 個陣列開始,通過對匹配項進行spliting(取決于匹配順序,可能還取決于模式中的順序),根據匹配項的數量將輸入行拆分為多個陣列,匹配“a” ,輸入單詞“canada”拆分為“c”“n”“d”“”。
您可以在此處匹配多字符模式(在??模式的前面放置較長的模式)
(注意,數字陣列似乎從 0, print a[x-1], in開始$ <<< canada awk '{split($0,a,"a"); for (x in a) print a[x-1]}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/431386.html
