[英]How can I count most occuring sequence of 3 letters within a word with a bash script
我有一個示例文件,如
XYZAcc
ABCAccounting
Accounting firm
Accounting Aco
Accounting Acompany
Acoustical consultant
在這里,我需要 grep 一個單詞中出現最多的 3 個字母序列
輸出應該是
acc = 5 aco = 3
這在 Bash 中可能嗎?
我完全不知道如何使用 awk、sed、grep 來完成它。
任何線索如何可能......
PS:沒有輸出,因為我不知道該怎么做,我不想寫不必要的 awk -F, xyz abc ......這對任何地方都沒有幫助......
以下是如何開始我認為您正在嘗試做的事情:
$ cat tst.awk
BEGIN { stringLgth = 3 }
{
for (fldNr=1; fldNr<=NF; fldNr++) {
field = $fldNr
fieldLgth = length(field)
if ( fieldLgth >= stringLgth ) {
maxBegPos = fieldLgth - (stringLgth - 1)
for (begPos=1; begPos<=maxBegPos; begPos++) {
string = tolower(substr(field,begPos,stringLgth))
cnt[string]++
}
}
}
}
END {
for (string in cnt) {
print string, cnt[string]
}
}
.
$ awk -f tst.awk file | sort -k2,2nr
acc 5
cou 5
cco 4
ing 4
nti 4
oun 4
tin 4
unt 4
aco 3
abc 1
ant 1
any 1
bca 1
cac 1
cal 1
com 1
con 1
fir 1
ica 1
irm 1
lta 1
mpa 1
nsu 1
omp 1
ons 1
ous 1
pan 1
sti 1
sul 1
tan 1
tic 1
ult 1
ust 1
xyz 1
yza 1
zac 1
這是Ed Morton 解決方案的替代方法。 它更少循環,但需要更多內存。 這個想法是不關心空格或任何非字母字符。 我們最后將它們過濾掉。
awk -v n=3 '{ for(i=length-n+1;i>0;--i) a[tolower(substr($0,i,n))]++ }
END {for(s in a) if (s !~ /[^a-z]/) print s,a[s] }' file
當您使用 GNU awk 時,您可以通過將每個記錄設置為一個單詞來進行一些不同的優化和優化。 這樣結束選擇就不需要發生:
awk -v n=3 -v RS='[[:space:]]' '
(length>=n){ for(i=length-n+1;i>0;--i) a[tolower(substr($0,i,n))]++ }
END {for(s in a) print s,a[s] }' file
這可能對您有用(GNU sed、sort 和 uniq):
sed -E 's/.(..)/\L&\n\1/;/^\S{3}/P;D' file |
sort |
uniq -c |
sort -s -k1,1rn |
sed -En 's/^\s*(\S+)\s*(\S+)/\2 = \1/;H;$!b;x;s/\n/ /g;s/.//p'
使用第一個 sed 調用輸出 3 個字母的小寫單詞。
對單詞進行排序。
計算重復項。
以相反的數字順序對計數進行排序,保持字母順序。
使用第二個 sed 調用將結果處理為所需的格式。
如果您只想要重復行且按字母順序和區分大小寫的行,請使用:
sed -E 's/.(..)/&\n\1/;/^\S{3}/P;D' file |
sort |
uniq -cd |
sed -En 's/^\s*(\S+)\s*(\S+)/\2 = \1/;H;$!b;x;s/\n/ /g;s/.//p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.