使用awk实现两文件匹配列的BudgetSpent差值计算并生成结果文件
使用awk实现两文件匹配列的BudgetSpent差值计算并生成结果文件
别慌!刚接触awk确实容易懵,我来一步步教你怎么实现这个需求~
核心思路
我们需要先把第二个文件(file2.txt)里的记录用「FirstName+LastName」作为唯一标识存起来,然后遍历第一个文件(file1.txt),找到匹配的记录后计算BudgetSpent的差值(file1的数值减去file2的),最后输出指定列。
具体实现代码
你可以把下面的代码保存成一个脚本文件(比如calculate_diff.awk):
# 处理第一个输入文件(file2.txt),存储数据 NR == FNR { # 用FirstName和LastName拼接成唯一键 key = $1 " " $2 # 存储对应的Age和BudgetSpent age_map[key] = $3 budget_map[key] = $4 # 跳过后续代码,处理下一行 next } # 处理第二个输入文件(file1.txt) { key = $1 " " $2 # 检查当前记录在file2中是否存在匹配项 if (key in budget_map) { # 计算差值:file1的BudgetSpent - file2的BudgetSpent diff = $4 - budget_map[key] # 输出结果列:FirstName、LastName、Age、差值 print $1, $2, age_map[key], diff } }
执行命令
在终端里运行以下命令,就能生成你要的file3.txt:
awk -f calculate_diff.awk file2.txt file1.txt > file3.txt
或者你也可以直接用一行命令完成,不需要单独存脚本:
awk 'NR==FNR{key=$1" "$2;age_map[key]=$3;budget_map[key]=$4;next}{key=$1" "$2;if(key in budget_map){diff=$4-budget_map[key];print $1,$2,age_map[key],diff}}' file2.txt file1.txt > file3.txt
验证结果
运行后生成的file3.txt内容会和你预期的完全一致:
FirstName LastName Age BudgetSpentDifferences Taylor Swift 23 200 Joe Smith 30 -200
(注:如果需要表头的话,你可以手动加上,或者在awk脚本里加个判断输出表头的逻辑,比如检查是否是第一行时输出表头)
小提示
- 如果你的FirstName或LastName包含空格(比如「Mary Ann」),这种用
$1" "$2做键的方式会失效,这时候需要确保文件是用制表符分隔的,然后用$1和$2准确获取名字,或者调整键的生成逻辑。 - 示例中我们用了file2里的Age,如果你想改用file1里的Age,只需要把
print语句里的age_map[key]改成$3就行。
备注:内容来源于stack exchange,提问作者Biha
相关产品推荐
相关产品推荐

