Linux下用awk/sed实现跨文件匹配替换及最小数值行筛选
Linux 文本处理需求实现方案
第一步:生成匹配替换后的 file3
实现逻辑
先加载 File2 的映射关系,将第一列转小写作为键、第二列作为值存入数组,解决大小写匹配问题。逐行处理 File1 时,分别检查第1、2列转小写后是否在映射数组中,存在则替换为对应值,最后输出整行。
执行命令
awk 'FNR==NR { a[tolower($1)] = $2 next } { k1 = tolower($1) k2 = tolower($2) if (k1 in a) $1 = a[k1] if (k2 in a) $2 = a[k2] print }' File2 File1 > file3
执行后生成的file3与你给出的预期结果完全一致。
第二步:生成无序列分组取最小值后的 file4
实现逻辑
对 file3 每一行,将第1、2列按字典序排序后拼接为分组键,确保A B和B A这类无序列的行被分到同一组。遍历过程中记录每个分组的最小第三列数值及对应的完整行,最后输出所有分组的最小行。
执行命令
awk '{ key = ($1 < $2) ? $1 "|" $2 : $2 "|" $1 if (!(key in min_val) || $3 < min_val[key]) { min_val[key] = $3 res_line[key] = $0 } } END { for (k in res_line) print res_line[k] }' file3 > file4
执行后生成的file4与你给出的预期结果完全一致。
过往命令错误说明
- 第一步命令错误使用
$1,$2作为复合键匹配,不符合单列元素逐个匹配的需求,同时未处理大小写差异导致小写beta未匹配成功。 - 第二步命令没有正确生成无序两列的分组键,导致分组逻辑错误,无法聚合
A B和B A类的行。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

