如何用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
相关产品推荐
相关产品推荐

