求助:用Shell脚本对比两个CSV文件并逐行输出PASS/FAIL结果
解决方案:Shell脚本逐行对比两个CSV文件并输出结果
针对你要对比File1.csv和File2.csv并生成PASS/FAIL结果的需求,我整理了一个实用的Shell脚本方案,同时考虑了常见的边缘情况:
完整脚本示例
#!/bin/bash # 配置文件路径 INPUT_FILE1="File1.csv" INPUT_FILE2="File2.csv" OUTPUT_RESULT="comparison_results.txt" # 先检查输入文件是否存在 if [ ! -f "$INPUT_FILE1" ]; then echo "Error: 文件 $INPUT_FILE1 不存在,请检查路径!" exit 1 fi if [ ! -f "$INPUT_FILE2" ]; then echo "Error: 文件 $INPUT_FILE2 不存在,请检查路径!" exit 1 fi # 清空结果文件(如果已存在) > "$OUTPUT_RESULT" # 逐行合并并对比两个文件 paste "$INPUT_FILE1" "$INPUT_FILE2" | while IFS=$'\t' read -r line_from_file1 line_from_file2; do # 严格匹配行内容 if [ "$line_from_file1" = "$line_from_file2" ]; then result_msg="PASS: 行内容匹配 - '$line_from_file1'" else result_msg="FAIL: 行内容不匹配 | File1: '$line_from_file1' | File2: '$line_from_file2'" fi # 同时输出到控制台和结果文件 echo "$result_msg" | tee -a "$OUTPUT_RESULT" done # 额外检查两个文件的行数是否一致 count_file1=$(wc -l < "$INPUT_FILE1") count_file2=$(wc -l < "$INPUT_FILE2") if [ "$count_file1" -ne "$count_file2" ]; then warning_msg="警告:两个文件行数不匹配!File1有 $count_file1 行,File2有 $count_file2 行" echo "$warning_msg" | tee -a "$OUTPUT_RESULT" fi echo "对比任务完成,结果已保存到 $OUTPUT_RESULT"
关键功能说明
- 文件存在性检查:避免因为文件路径错误导致脚本报错中断
paste命令合并行:将两个文件的对应行用制表符分隔,方便一次性读取两行内容- 逐行对比逻辑:用
read命令分别读取两行内容,严格匹配后输出对应结果 - 双输出机制:通过
tee -a同时将结果打印到控制台和追加到结果文件,方便实时查看和后续复盘 - 行数一致性校验:如果两个文件行数不同,会在结果末尾添加警告,避免遗漏对比
可选优化项
如果你的CSV有特殊场景,可以调整脚本:
- 跳过表头:如果CSV第一行是表头不需要对比,把
paste那行改成:tail -n +2 "$INPUT_FILE1" | paste - <(tail -n +2 "$INPUT_FILE2") | while ... - 忽略大小写对比:把匹配逻辑改成:
if [ "$(echo "$line_from_file1" | tr '[:upper:]' '[:lower:]')" = "$(echo "$line_from_file2" | tr '[:upper:]' '[:lower:]')" ]; then - 处理含制表符的CSV行:如果你的CSV内容里有制表符,把
paste的分隔符改成一个不会出现在内容里的字符(比如|),同时修改IFS:paste -d '|' "$INPUT_FILE1" "$INPUT_FILE2" | while IFS='|' read -r line_from_file1 line_from_file2; do
内容的提问来源于stack exchange,提问作者Nitesh S.
相关产品推荐
相关产品推荐

