如何在BASH中仅获取diff对比里第一个文件独有的行?
提取第一个文件独有的行的解决方案
你原来的命令存在两个关键问题:
- 默认
diff输出的带<行包含前缀<,直接过滤得到的不是原始行内容 diff会输出---这类分隔符,干扰后续过滤逻辑
以下是三种更可靠的实现方式,按需选择:
方法1:用diff直接输出目标行(保留原行顺序)
通过diff的格式化参数,跳过冗余输出,直接生成第一个文件独有的行:
diff --changed-group-format='%<' --unchanged-group-format='' "/ripe_route_from_${place}_v4" "/unspecified_route_from_${place}_v4" > ripe_routes_diff_unspecified
--changed-group-format='%<':仅保留第一个文件中独有的行(自动去掉<前缀)--unchanged-group-format='':完全忽略两个文件的共同行
方法2:用grep反向匹配(无需排序,保留原顺序)
适合小文件场景,直接匹配第一个文件中不存在于第二个文件的行:
grep -Fxvf "/unspecified_route_from_${place}_v4" "/ripe_route_from_${place}_v4" > ripe_routes_diff_unspecified
-F:将第二个文件的行视为固定字符串,避免正则表达式干扰-x:强制整行精确匹配,避免部分匹配的误判-v:反向输出,只保留不匹配第二个文件的行-f:从第二个文件读取匹配规则
方法3:用comm命令(大文件首选,效率极高)
comm是专为有序文件对比设计的工具,处理大文件时速度远超前两种方法,但输出是排序后的行:
comm -23 <(sort "/ripe_route_from_${place}_v4") <(sort "/unspecified_route_from_${place}_v4") > ripe_routes_diff_unspecified
-23:屏蔽第二个文件独有的行(第2列)和两个文件的共同行(第3列),仅保留第一个文件独有的行(第1列)<(sort ...):通过进程替换先对两个文件排序,满足comm对输入有序的要求
内容的提问来源于stack exchange,提问作者Navar0ne
相关产品推荐
相关产品推荐

