在 Linux 上从另一个文本文件的内容中减去一个文本文件的内容

在 Linux 上从另一个文本文件的内容中减去一个文本文件的内容

我在 Linux 上有两个文本文件。其中一个包含有效 ID 列表。例如:

abcd
efgh
ijkl
etc.

另一个包含无效 ID 列表。但是,其中一些也出现在有效 ID 列表中,在此示例中为“efgh”:

mnop
qrst
efgh
etc.

如何轻松构建一个文本文件,其中包含无效列表中未出现在有效列表中的所有行? 也就是说,我希望最终得到一个包含以下内容的文本文件:

mnop
qrst
etc.

我想要一些 Linux 命令行魔法或一些巧妙的 Vim 技巧。提前致谢!

答案1

我认为通信可以帮助您做您想做的事。

它是一个鲜为人知的命令行工具,存在于大多数 Linux 系统中。

答案2

假设您有名为valid和的文件invalid,您可以对它们进行排序:

排序有效 > 排序有效;排序无效 > 排序无效

然后比较:

差异 有效排序 无效排序

输出将是(假设您的示例数据):

1d0
< abcd
3c2,3
< ijkl
---
> mnop
> qrst

带有“<”的内容仅存在于第一个文件中,带有“>”的内容仅存在于第二个文件中(无效)。

因此diff valid-sorted invalid-sorted |grep '^>'应该给你出现在无效但不有效的字符串。

去掉前导 '>' 留给读者作为练习 ;-)

警告:如果您的输入文件实际上在行首包含“>”,则此方法将不起作用。那么您必须采取一些技巧...

答案3

我有我自己的效用因为,这取决于其他;它们也适用于未分类的输入。基本用法是

except file1 file2 > file2-except-any-lines-in-file1

相关内容