如何在Bash中对两个文件的行执行忽略位置的集合差运算?
Bash实现行级集合差运算
完全可以轻松实现,下面分两种常用场景给出具体命令:
方案一:允许先排序(推荐,效率更高)
用系统自带的comm命令,它专门处理已排序的文件,默认输出三列内容:仅第一个文件有的行、仅第二个文件有的行、两个文件共有的行。通过参数可以只保留需要的列:
获取file1有但file2没有的行:
comm -23 <(sort file1) <(sort file2)(
-23表示抑制第二列(仅file2的行)和第三列(共有的行),只保留第一列)获取file2有但file1没有的行:
comm -13 <(sort file1) <(sort file2)(
-13表示抑制第一列和第三列,只保留第二列)
如果需要严格符合集合元素唯一性(去重),可以在排序时加-u参数:
comm -23 <(sort -u file1) <(sort -u file2)
方案二:不需要排序(保留原行顺序)
用grep命令实现,无需提前排序,直接按原文件行顺序输出结果:
获取file1有但file2没有的行:
grep -vFxf file2 file1获取file2有但file1没有的行:
grep -vFxf file1 file2
参数说明:
-v:反向匹配,输出不匹配的行-F:将每行当作固定字符串处理,避免正则表达式符号干扰-x:要求整行完全匹配,避免部分匹配的情况-f:从指定文件中读取每行作为匹配模式
示例验证
假设file1内容(每行一个元素):
a b c d f g
file2内容:
a b c e g h
- 执行
comm -23 <(sort file1) <(sort file2),输出:d f - 执行
comm -13 <(sort file1) <(sort file2),输出:e h - 执行
grep -vFxf file2 file1,输出(保留原顺序):d f
内容的提问来源于stack exchange,提问作者CmdrVim
相关产品推荐
相关产品推荐

