如何使用awk处理两个文件并通过条件判断新增标识列?
实现方案
awk 实现(推荐,效率高,无需额外工具)
直接执行以下命令即可得到目标输出:
awk 'NR==FNR {arr[$0]=1; next} {print $0, ($0 in arr ? "Present" : "Absent")}' File2 File1
命令说明
- 注意传入文件的顺序必须是 先File2,后File1,这是很多人调试失败的常见原因
NR==FNR:判断当前处理的是第一个传入的文件(File2),NR是全局累计行号,FNR是当前文件的独立行号,二者相等时即处于第一个文件的处理逻辑arr[$0]=1:将File2的每一行内容作为键存入哈希数组arrnext:跳过后续逻辑,直接处理下一行,避免第一个文件的内容进入后续判断逻辑- 处理File1时,判断当前行是否存在于
arr数组中,存在则拼接Present,否则拼接Absent,完全保留File1的原有行顺序
边界情况适配
如果两个文件的行可能存在首尾空白字符(空格、制表符等)需要忽略匹配,可以用以下版本自动 trim 后再判断:
awk ' function trim(s) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", s) return s } NR==FNR { arr[trim($0)]=1 next } { print $0, (trim($0) in arr ? "Present" : "Absent") }' File2 File1
内容的提问来源于stack exchange,提问作者Diesel
相关产品推荐
相关产品推荐

