Shell脚本中对比两个文件列并生成指定格式file3的方法求助
解决方案:用Awk实现列对比与结果生成
没问题,这个需求用awk就能轻松搞定,它处理这类文本列匹配的场景特别高效。下面是具体的实现方法:
方法一:单行命令直接运行
你可以直接在终端执行这条命令,不需要额外写脚本文件:
awk 'BEGIN { FS = ","; OFS = "," } NR == FNR { val[$2] = $1; next } { print $2, $1, ($2 in val ? val[$2] : 0) }' file2 file1 > file3
方法二:写成Awk脚本文件(更易维护)
如果以后需要修改逻辑,把代码写到脚本里更方便:
- 创建一个名为
compare_files.awk的文件,内容如下:
BEGIN { # 设置输入和输出的字段分隔符为逗号 FS = "," OFS = "," } # 处理第一个输入文件(file2):将时间戳映射到对应数值 NR == FNR { val[$2] = $1 next # 跳过后续逻辑,处理下一行 } # 处理第二个输入文件(file1):生成目标格式的行 { # 检查当前时间戳是否在file2的映射里,存在则取对应值,否则用0 file2_val = ($2 in val) ? val[$2] : 0 # 按要求格式输出:时间戳, file1的数值, file2的数值/0 print $2, $1, file2_val }
- 运行脚本生成file3:
awk -f compare_files.awk file2 file1 > file3
效果验证
用你给出的示例文件测试:
- file1的内容:
21,2018042100
22,2018042101
87,2018042102
98,2018042103
- file2的内容:
45,2018042100
86,2018042102
87,2018042103
运行后生成的file3完全符合你的要求:
2018042100,21,45
2018042101,22,0
2018042102,87,86
2018042103,98,87
内容的提问来源于stack exchange,提问作者Smdevfunia
相关产品推荐
相关产品推荐

