如何提取符合特定列条件的首列数据?AWK实现求助
解决方法
你的问题出在原awk命令的两个关键问题上:
- 对符合条件的第一列数据是直接赋值而非追加,导致同一第三列的多个值只会保留第一个;
- 错误地将第三列的值也加入了判断用的数组,导致后续行的判断逻辑被干扰。
根据你的需求,我们需要先维护一个仅记录第二列已出现值的集合,然后对每一行先判断第三列是否未在该集合中,若是则将第一列追加到对应第三列的结果列表,最后再将当前行的第二列加入集合(避免影响当前行的判断)。
修正后的awk命令如下:
awk -F"," ' # 如果第三列的值未在已出现的第二列中 !seen_second[$3] { # 追加第一列到结果,已有值则加逗号分隔 result[$3] = (result[$3] ? result[$3] ", " $1 : $1) } # 标记当前行的第二列已出现 { seen_second[$2] = 1 } # 输出最终结果 END { for (key in result) { print key, result[key] } }' cg.txt
逻辑解释
seen_second数组:专门记录所有已处理过的第二列的值,作为判断第三列是否出现过的依据;- 处理每一行时,先检查
$3是否不在seen_second中:- 如果是,就把
$1追加到result[$3]中(用三元表达式简化判断,已有值则加逗号分隔);
- 如果是,就把
- 之后再把当前行的
$2标记到seen_second中,确保后续行的判断包含这个值; - 最后在
END块中遍历result数组,输出每个第三列对应的所有符合条件的第一列。
测试结果
运行这个命令后,会得到你预期的结果:
A 10 E 20, 40, 50 N 120, 130
内容的提问来源于stack exchange,提问作者stack0114106
相关产品推荐
相关产品推荐

