文章

两个文件对比

输出在文件 aaa 中,但不在文件 bbb 中的行

方式1. awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
awk 'NR==FNR{a[$0]=1;next} !a[$0]' bbb aaa

NR==FNR{a[$0]=1;next}: 处理第一个文件 bbb 时,将文件中的每一行存储在数组 a 中,并设置数组元素的值为 1。next 用于跳过后续的命令,以便处理下一行。

!a[$0]: 处理第二个文件 aaa 时,检查当前行是否不在数组 a 中,如果不在,表示它在文件 bbb 中没有匹配


注意: 
为什么需要使用next?
1. 不使用next,将导致在第一个文件中的每一行都将执行接下来的语句,而不会跳过到第二个文件。这样就会导致第二个文件的每一行都与第一个文件中的所有行进行比较,而不仅仅是与匹配的行。

2. 在这种情况下,结果可能包含许多重复的行,因为第二个文件的每一行都会与第一个文件的所有行匹配,而不仅仅是与不同的行匹配。

3. 因此,使用next是为了确保在处理第一个文件时跳过接下来的语句,只对下一个记录执行后续操作,以提高效率并避免不必要的比较

方式2. grep

1
2
3
4
5
6
7
8
9
10
11
12
grep -Fxvf bbb aaa

-F:表示使用固定字符串(Fixed Strings)而不是正则表达式进行匹配。这意味着 grep 将把模式中的特殊字符视为普通字符,而不是正则表达式的元字符。

-x:要求模式完全匹配整行,而不是匹配行中的任意部分。只有整行与模式完全匹配时,才会输出。

-v:反向选择,即输出不匹配模式的行。

-f bbb:从文件 bbb 中读取模式。bbb 文件中的每一行都被视为一个模式。

aaa:要搜索的文件。

本文由作者按照 CC BY 4.0 进行授权