shell文本对比小工具

用于对比两个文本文件的值差异,并将差异文件输出保存;

支持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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Shell脚本中,有一些比较复杂的命令,需要掌握一些特殊的语法和技巧,才能够正确使用和理解。下面列举一些比较复杂的Shell命令: 1. awk:awk是一种文本处理工具,可以用来对文本进行搜索、过滤、替换、计算等操作。awk命令比较复杂,需要掌握一些特殊的语法和技巧,例如使用$符号来引用变量、使用FS和OFS变量来控制字段分隔符、使用NR和NF变量来控制行和列等。 2. sed:sed是一种流编辑器,可以对文本进行修改和替换。sed命令也比较复杂,需要掌握一些特殊的语法和技巧,例如使用s命令来进行替换、使用正则表达式来匹配文本、使用&符号来引用匹配的文本等。 3. find:find命令是一种用于查找文件和目录的命令,可以根据各种条件来查找文件和目录。find命令也比较复杂,需要掌握一些特殊的语法和技巧,例如使用-name和-type选项来指定查找条件、使用-exec选项来执行命令等。 4. xargs:xargs命令是一种用于将标准输入转换为命令行参数的工具,可以将一组命令行参数分批传递给其他命令。xargs命令也比较复杂,需要掌握一些特殊的语法和技巧,例如使用-d选项来指定分隔符、使用-n选项来指定每批参数的数量、使用-I选项来指定替换字符串等。 总之,这些命令在Shell脚本中使用非常广泛,需要掌握一些特殊的语法和技巧才能够熟练使用。使用这些命令可以大大提高Shell脚本的灵活性和功能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值