AWK实现匹配Field1并拼接所有匹配行Field4的技术求助
当然可以帮你搞定这个需求!用AWK处理这种按字段分组提取的任务,可比Excel高效太多了——尤其是面对大文件的时候,完全不用卡半天。
需求拆解
我们要实现的逻辑是:按第一列(Field1)分组,输出每个分组的Field1值,以及该分组下所有行的第四列(Field4)值。
AWK脚本实现
这里给你两种常用的实现方式,你可以根据自己的需求选择:
方式1:先收集所有数据再统一输出(推荐,不管输入是否排序都能正确分组)
# 遍历每一行,把同一Field1的Field4收集到数组里 { # 用Field1作为数组键,Field4追加到对应值后,用空格分隔 groups[$1] = groups[$1] " " $4 } # 所有行处理完后,输出每个分组的结果 END { for (key in groups) { # 去掉开头多余的空格,然后输出Field1 + 所有Field4 print key substr(groups[key], 2) } }
方式2:实时输出(适合输入已经按Field1排序的情况)
如果你的输入文件已经是按Field1排序好的,也可以用这种边读边输出的方式,节省内存:
# 记录当前正在处理的Field1 prev_key = "" { # 如果当前行的Field1和上一行不同,先换行(第一行除外) if ($1 != prev_key && prev_key != "") { print "" } # 如果是第一次遇到这个Field1,先输出Field1值 if ($1 != prev_key) { printf "%s", $1 prev_key = $1 } # 追加输出当前行的Field4 printf " %s", $4 } # 最后补一个换行,确保格式完整 END { print "" }
效果演示
拿你给出的输入片段举例:
ASHBBPRJ01-ASHBBPRJ02-BE ASHBBPRJ01.RD.AS 1 ASHBBBRJ01.RD.AS ae1.0 strict
ASHBBPRJ01-ASHBBPRJ02-BE ASHBBPRJ01.RD.AS 2 ASHBBPRJ02.RD.AS ae1.0 strict
用方式1处理后,输出结果是:ASHBBPRJ01-ASHBBPRJ02-BE ASHBBBRJ01.RD.AS ASHBBPRJ02.RD.AS
自定义调整
如果想要用其他分隔符(比如换行、逗号)来分隔Field4,只需要修改脚本里的分隔符即可。比如要让每个Field4单独换行:
把groups[$1] = groups[$1] " " $4改成groups[$1] = groups[$1] "\n" $4,输出时的格式也会对应变化。
内容的提问来源于stack exchange,提问作者user3746195
相关产品推荐
相关产品推荐

