使用 AWK [closed] 打印字符串中出现频率最高的字母

Print the most frequently occuring letter in a string using AWK [closed]

提问人:SG Kwon 提问时间:6/30/2023 最后编辑:Ed MortonSG Kwon 更新时间:6/30/2023 访问量:67

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

5个月前关闭。

我有文本文件

('1', 6310445)  [12, 20]_S:0.6:0:ACAAAAAAAAAAA_i_V
('1', 17704109) [12, 31]_S:0.387:0:CCCCCCCCCCCC_i_V
('1', 18922274) [8, 22]_S:0.364:0:AAAAAAAA_i_V
('1', 22750694) [8, 19]_S:0.421:0:TTTTTTTT_i_V
('1', 25564545) [9, 23]_S:0.391:0:AAAAAAAAA_i_V
('1', 29189562) [13, 34]_S:0.382:0:AAAAAAAAAAAAA_i_V
('1', 30166561) [14, 20]_S:0.7:0:TTTTTTTTTTTTTT_i_V
('1', 30450439) [9, 14]_S:0.643:0:AAAAAAAAA_i_V
('1', 30981321) [12, 23]_S:0.522:0:AAAAAAAAAAAA_i_V

我想在最后一个“:”和第一个“_”之间打印最常出现的字母。

这意味着

“ACAAAAAAAAAAA” => A, “CCCCCCCCCCCC”:=>C . . . .

输出将是

一个 C 一个 T 一个 一个 T 一个 一个

我该怎么办?

Linux AWK 分隔符

评论

3赞 Cyrus 6/30/2023
请编辑您的问题(无评论):您搜索了什么,您找到了什么?你尝试过什么,它是如何失败的?
2赞 jhnc 6/30/2023
如果你有“ACACACACAC”怎么办?

答:

2赞 jhnc 6/30/2023 #1

您可以使用简单的 reduce 样式方法:

awk -F: -v ORS= '
    NF>1 && split($NF,a,/_/)>1 {
        for (i=length(s=a[1]); i>0; i--)
            if (++n[c=substr(s,i,1)] > n[r])
                r=c
        print r OFS

        split(r="",n) # reset state
    }
    END { print "\n" }
' textfile

如果出现频率最高的是多个字符(例如),则将打印第一个达到最大值的字符。ABCABCABC