删除文件中的公共行

删除文件中的公共行

我有两个文件文件A&文件B

fileA 有很多 IP,而 fileB 有较少 IP。我们该怎么办

fileA - fileB = fileC(没有公共 IP 的文件)

文件A

1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5

文件B

4.4.4.4
1.1.1.1

文件C

2.2.2.2
3.3.3.3
5.5.5.5

我在谷歌上有很多选择,但找不到任何相关的东西

答案1

comm工具在这里可能很有用,特别是如果您不关心结果按字母数字顺序排序:

comm -23 <( sort -u fileA ) <( sort -u fileB ) >fileC

有关其使用的详细信息,请参阅man sort和。man comm

答案2

为此fileA - fileB,您可以使用 awk (这不会仅在 中获取 IP fileB):

awk 'NR==FNR{a[$0];next}!($0 in a)' fileB fileA

NR指总记录数,FNR指当前文件中的记录号(一般为行号)。因此,如果第一个文件中存在一行,则第二个文件中不会显示该行。


如果您需要删除 fileA 中的重复行,请使用:

awk 'NR==FNR{a[$0]++;next}!a[$0]++' fileB fileA

答案3

这个问题可以用几种不同的方式来解释。

我假设每一行在它所在的文件中都是唯一的。

  • 假设您要从中删除fileA也在 中找到的条目fileB

    fileB这将从 中的IP 地址中删除在 中找到的 IP 地址fileA

    grep -v -Fx -f fileB fileA >fileC
    

    这里使用的选项grep确保模式(从fileBusing读取的行-f)被视为字符串而不是正则表达式 ( -F),并且我们匹配整行而不是子字符串 ( -x)。我们还反转匹配的含义,以-v输出fileA与 中的任何行都不匹配的所有行fileB

  • 假设您想要获取唯一的所有条目fileA 或者其独特之处在于fileB

    以下输出文件中不重复的行。它使用-uwith uniq,这是一个非标准但常用的选项,用于输出在后续行中不重复的行。

    sort fileA fileB | uniq -u >fileC
    

答案4

如果保留顺序并不重要,您可以首先删除第一个文件中的重复项,然后将输出与第二个文件连接两次(用于删除它特有的任何内容),然后仅打印带有uniq -u.

sort -u fileA | cat - fileB fileB | sort | uniq -u

相关内容