Linux文件之间取差集

Administrator 2 2025-07-04

在 Linux 中,你可以使用 grepawkcomm 命令来找出 b.txt 中存在但 a.txt 中不存在的行,并打印到终端。以下是几种方法:


方法 1:使用 grep(推荐)

grep -vxFf a.txt b.txt

解释:

  • -v:反向匹配,显示不匹配的行。

  • -x:整行匹配(避免部分匹配)。

  • -F:将模式视为固定字符串(而非正则表达式,提高速度)。

  • -f a.txt:从 a.txt 读取匹配模式。

  • b.txt:要搜索的文件。

示例:

$ cat a.txt
apple
banana
orange
 
$ cat b.txt
banana
grape
orange
pear
 
$ grep -vxFf a.txt b.txt
grape
pear

方法 2:使用 awk

awk 'NR==FNR {a[$0]; next} !($0 in a)' a.txt b.txt

解释:

  1. NR==FNR:处理第一个文件(a.txt)时,记录所有行到数组 a

  2. next:跳过后续操作,继续读取 a.txt

  3. !($0 in a):处理第二个文件(b.txt)时,如果当前行不在数组 a 中,则打印。

示例:

$ awk 'NR==FNR {a[$0]; next} !($0 in a)' a.txt b.txt
grape
pear

方法 3:使用 comm(需先排序)

comm -23 <(sort b.txt) <(sort a.txt)

解释:

  • comm:比较两个已排序的文件。

  • -23

    • -2:隐藏 a.txt 独有的行。

    • -3:隐藏两个文件共有的行。

    • 最终只显示 b.txt 独有的行。

  • <(sort ...):进程替换,先对文件排序。

示例:

$ comm -23 <(sort b.txt) <(sort a.txt)
grape
pear

总结

方法

命令

特点

grep

grep -vxFf a.txt b.txt

简洁高效,适合大多数情况

awk

awk 'NR==FNR {a[$0]; next} !($0 in a)' a.txt b.txt

灵活,适合复杂逻辑

comm

comm -23 <(sort b.txt) <(sort a.txt)

需排序,适合大数据量

推荐使用 grep 方法,因为它最简单且性能较好。