用于对比两个文本文件的值差异,并将差异文件输出保存;
支持txt/csv/json文件的比对;
#!/bin/bash
# 从命令行获取输入文件路径参数
file1_path=$1
file2_path=$2
# 获取文件名和扩展名
file1_name=$(basename -- "${file1_path%.*}")
file2_name=$(basename -- "${file2_path%.*}")
output_file="${file1_name}_not_in_${file2_name}.txt"
# 根据文件类型处理文件并输出结果到指定文件
if [[ $file1_path == *.csv ]] && [[ $file2_path == *.csv ]]; then
# 处理CSV文件
# 提取文件1每行的值,并进行排序和去重操作
cut -d, -f1- "$file1_path" | sort -u > /tmp/file1_lines.txt
# 提取文件2每行的值,并进行排序和去重操作
cut -d, -f1- "$file2_path" | sort -u > /tmp/file2_lines.txt
# 比较文件1和文件2中的值,并输出文件1中在文件2中不存在的值到指定文件
comm -23 /tmp/file1_lines.txt /tmp/file2_lines.txt > "$output_file"
elif [[ $file1_path == *.json ]] && [[ $file2_path == *.json ]]; then
# 处理JSON文件
# 提取文件1每个JSON对象的值,并进行排序和去重操作
jq -r '.[]' "$file1_path" | sort -u > /tmp/file1_lines.txt
# 提取文件2每个JSON对象的值,并进行排序和去重操作
jq -r '.[]' "$file2_path" | sort -u > /tmp/file2_lines.txt
# 比较文件1和文件2中的值,并输出文件1中在文件2中不存在的值到指定文件
comm -23 /tmp/file1_lines.txt /tmp/file2_lines.txt > "$output_file"
elif [[ $file1_path == *.txt ]] && [[ $file2_path == *.txt ]]; then
# 处理TXT文件
# 对文件1的值进行排序和去重操作
sort -u "$file1_path" > /tmp/file1_lines.txt
# 对文件2的值进行排序和去重操作
sort -u "$file2_path" > /tmp/file2_lines.txt
# 比较文件1和文件2中的值,并输出文件1中在文件2中不存在的值到指定文件
comm -23 /tmp/file1_lines.txt /tmp/file2_lines.txt > "$output_file"
else
echo "不支持的文件类型,请确保输入文件均为csv、json或txt文件。"
fi
# 删除临时文件
rm /tmp/file1_lines.txt
rm /tmp/file2_lines.txt
新建两个文件用于比对并执行脚本
/script# cat << eof> file_1.txt
> 1
> 2
> 12
> 123
> 1234
> eof
/script# cat << eof> file_2.txt
> 1
> 2
> 123
> eof
/script# sh compare.sh file_1.txt file_2.txt
/script# ls -l
-rw-r--r-- 1 root root 2037 Dec 7 08:02 compare.sh
-rw-r--r-- 1 root root 16 Dec 7 09:35 file_1.txt
-rw-r--r-- 1 root root 8 Dec 7 09:36 file_1_not_in_file_2.txt
-rw-r--r-- 1 root root 8 Dec 7 09:35 file_2.txt
查看输出文件
/script#cat file_1_not_in_file_2.txt
12
1234