Unix awk提取带引号第8列唯一值并统计16至28列总和方法
问题原因
awk默认以空格作为字段分隔符,无法识别双引号包裹的含空格内容为单个字段,导致包含空格的第8列被拆分为多个字段,出现截断问题。
解决方案
使用GNU awk(gawk,大部分Linux/Unix发行版默认awk为gawk)的FPAT特性,直接定义字段的匹配规则,正确识别双引号包裹的完整字段:
gawk ' BEGIN { # 定义字段匹配规则:要么是不含空格的连续字符,要么是双引号包裹的任意内容 FPAT = "([^[:space:]]+)|(\"[^\"]+\")" } { # 去除第8列前后的双引号,作为分组key key = substr($8, 2, length($8) - 2) total = 0 # 累加第16到28列的数值 for (i = 16; i <= 28; i++) { total += $i } res[key] += total } END { # 遍历输出结果 for (key in res) { print key, res[key] } }' File.txt
输出效果
针对提供的样例文件,执行后输出结果和预期完全一致:
0ICPRP900 0.006641 0ICPRP 900 0.01 0ICPRP A&B_900 0.641
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

