You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

使用步骤:

  1. 将上述内容保存为diff_lines.sh
  2. 执行chmod +x diff_lines.sh给脚本添加执行权限
  3. 调用示例:./diff_lines.sh 文件1 文件2即可输出仅在文件1存在的行

补充说明

  • 该方案不会修改原文件内容,也不需要提前对文件做排序,常规文件大小下执行效率优秀
  • 如果待筛查文件存在重复行,命令会原样输出所有符合条件的重复行;如果需要去重,可以在命令末尾拼接| sort -u
  • 该匹配是严格整行匹配,行首尾的空格、制表符都会被纳入匹配范围,如果需要忽略首尾空白,可以先对两个文件做预处理再比对
  • 网上常见的comm命令方案要求两个输入文件必须提前排序,不适合直接处理未排序文件的场景,使用时需要注意

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:42:35