使用 shell 脚本比较两个列表

发布于 2024-08-09 06:32:42 字数 133 浏览 1 评论 0原文

假设我在文件 f1、f2 中有两个数字列表,每个数字每行一个。我想看看第一个列表中有多少数字不在第二个列表中,反之亦然。目前我正在使用 grep -f f2 -v f1,然后使用 shell 脚本重复此操作。这非常慢(平方时间很痛苦)。有更好的方法吗?

Suppose I have two lists of numbers in files f1, f2, each number one per line. I want to see how many numbers in the first list are not in the second and vice versa. Currently I am using grep -f f2 -v f1 and then repeating this using a shell script. This is pretty slow (quadratic time hurts). Is there a nicer way of doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

逆光下的微笑 2024-08-16 06:32:42

我喜欢用“comm”来形容这类事情。
(文件需要排序。)

$ cat f1
1
2
3
$ cat f2
1
4
5
$ comm f1 f2
        1
2
3
    4
    5
$ comm -12 f1 f2
1
$ comm -23 f1 f2
2
3
$ comm -13 f1 f2
4
5
$ 

I like 'comm' for this sort of thing.
(files need to be sorted.)

$ cat f1
1
2
3
$ cat f2
1
4
5
$ comm f1 f2
        1
2
3
    4
    5
$ comm -12 f1 f2
1
$ comm -23 f1 f2
2
3
$ comm -13 f1 f2
4
5
$ 
指尖凝香 2024-08-16 06:32:42

难道您不能将每个数字放在一行中,然后对它们进行 diff(1) 吗?您可能需要事先对列表进行排序,但要使其正常工作。

Couldn't you just put each number in a single line and then diff(1) them? You might need to sort the lists beforehand, though for that to work properly.

紙鸢 2024-08-16 06:32:42

在特殊情况下,一个文件是另一个文件的子集,以下内容:

cat f1 f2 | sort | uniq -u

将仅列出较大文件中的行。当然,通过管道传输到 wc -l 将显示计数。

然而,这并不完全是你所描述的。

这个单行经常满足我的特殊需求,但我希望看到一个更通用的解决方案。

In the special case where one file is a subset of the other, the following:

cat f1 f2 | sort | uniq -u

would list the lines only in the larger file. And of course piping to wc -l will show the count.

However, that isn't exactly what you described.

This one-liner serves my particular needs often, but I'd love to see a more general solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文