如何在Bash脚本中对比两个文件 找出仅在第一个文件存在的行
未排序文件差集筛选Bash实现
核心实现命令
不需要提前对文件做排序操作,直接用grep命令即可实现需求:
grep -Fxvf 参照文件 待筛查文件
对应本次需求,就是把第二个文件作为参照,第一个文件作为待筛查对象,命令写法为:
grep -Fxvf 文件2 文件1
参数说明
-F:将参照文件的内容按固定普通字符串匹配,不会解析正则符号,避免行内存在. * [这类特殊字符时出现匹配错误-x:要求整行内容完全一致才算匹配,杜绝部分内容匹配导致的误判-v:反向输出,只保留待筛查文件里没有在参照文件中匹配到的行-f:从指定的参照文件中读取所有需要匹配的行内容
用给出的示例测试:
文件1内容:
apple banana pineapple
文件2内容:
pineapple blueberry banana
执行上述命令后输出结果为apple,完全符合预期。
可复用脚本写法
如果需要频繁使用,可以写成支持传参的Bash脚本:
#!/bin/bash if [ $# -ne 2 ]; then echo "用法: $0 <待提取差集的文件> <作为参照的文件>" exit 1 fi if [ ! -f "$1" ] || [ ! -f "$2" ]; then echo "错误:请传入两个有效的文件路径" exit 1 fi grep -Fxvf "$2" "$1"
使用步骤:
- 将上述内容保存为
diff_lines.sh - 执行
chmod +x diff_lines.sh给脚本添加执行权限 - 调用示例:
./diff_lines.sh 文件1 文件2即可输出仅在文件1存在的行
补充说明
- 该方案不会修改原文件内容,也不需要提前对文件做排序,常规文件大小下执行效率优秀
- 如果待筛查文件存在重复行,命令会原样输出所有符合条件的重复行;如果需要去重,可以在命令末尾拼接
| sort -u - 该匹配是严格整行匹配,行首尾的空格、制表符都会被纳入匹配范围,如果需要忽略首尾空白,可以先对两个文件做预处理再比对
- 网上常见的
comm命令方案要求两个输入文件必须提前排序,不适合直接处理未排序文件的场景,使用时需要注意
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

