You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWK获取每行最后冒号与首下划线间出现最频繁的字符?

用AWK提取目标子串中出现最频繁的字符

需求说明

给定如下文本内容:

('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

需要提取每行中最后一个冒号到第一个下划线之间的子串,找出该子串里出现最频繁的字符,最终输出每个行对应的结果:

A
C
A
T
A
A
T
A
A

AWK实现方案

可以用以下AWK命令完成需求:

awk -F'[_:]' '{
    # 提取目标子串:最后一个冒号到第一个下划线之间的部分,对应倒数第二个字段
    str = $(NF-1)
    # 重置字符计数数组与跟踪变量
    delete cnt
    max_count = 0
    result_char = ""
    # 遍历子串每个字符,统计出现次数
    for (i=1; i<=length(str); i++) {
        curr_char = substr(str, i, 1)
        cnt[curr_char]++
        # 更新最大计数与对应字符
        if (cnt[curr_char] > max_count || (cnt[curr_char] == max_count && result_char == "")) {
            max_count = cnt[curr_char]
            result_char = curr_char
        }
    }
    # 输出当前行的结果
    print result_char
}' input.txt

代码解释

  • -F'[_:]':将字段分隔符设为下划线_或冒号:,每行被分割后,目标子串恰好是倒数第二个字段$(NF-1)。
  • delete cnt:处理每行前清空计数数组,避免上一行数据残留干扰统计。
  • 循环遍历子串的每个字符,用数组cnt记录每个字符的出现次数。
  • 实时跟踪出现次数最多的字符:当当前字符计数超过最大值,或者计数等于最大值但还未确定结果字符时,更新最大值和结果字符。
  • 最后打印每行对应的结果字符。

内容的提问来源于stack exchange,提问作者SG Kwon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:52:40