如何在UNIX中比较两个包含数字的文件?

如何在UNIX中比较两个包含数字的文件?,unix,compare,diff,Unix,Compare,Diff,我有两个文件。第一个文件包含500000条记录(数字),第二个文件包含4000000条记录(数字) 数字不是一行,而是一行一行的,就像Excel表格中的一列一样 文件1包含以下数字: 1483 2111 2973 3214 3503 3639 3747 4042 4351 4766 4809 5950 6616 6899 7559 7940 8205 8262 8291 1483 2111 2973 3214 3503 3639 3747 4042 4351 4766 4809 5950 6

我有两个文件。第一个文件包含500000条记录(数字),第二个文件包含4000000条记录(数字)


数字不是一行,而是一行一行的,就像Excel表格中的一列一样

文件1包含以下数字:

1483
2111
2973
3214
3503
3639
3747
4042
4351
4766
4809
5950
6616
6899
7559
7940
8205
8262
8291 
1483
2111
2973
3214
3503
3639
3747
4042
4351
4766
4809
5950
6616
6899
7559
7940
8205
8262
8291
9000
9163
9229
9497
9719
0409
0421
0698
0924
1059
文件2包含以下数字:

1483
2111
2973
3214
3503
3639
3747
4042
4351
4766
4809
5950
6616
6899
7559
7940
8205
8262
8291 
1483
2111
2973
3214
3503
3639
3747
4042
4351
4766
4809
5950
6616
6899
7559
7940
8205
8262
8291
9000
9163
9229
9497
9719
0409
0421
0698
0924
1059
我想找出第一个文件中有多少记录不存在于包含第二个文件的记录中。我试图用Excel进行比较,但我的笔记本电脑多次处于挂起状态。另外,我尝试在UNIX中使用diff命令,但没有达到预期的输出。
请有人帮我在UNIX中解决这个问题,因为它比其他方法花费的时间要少。

文件2中的数据没有完全排序;有些数字以0开头,最后是1。因此,您确实需要对数字进行排序,然后可以与Bash(kornshell,zshell)一起使用,并且:

如果你想数一数有多少这样的数字,那么:

comm -23 <(sort file.1) <(sort file.2) | wc -l

替代方案很多。

Awk也可能提供一些解决方案。这里有一个

此解决方案没有运行带有bash进程替换的
comm
解决方案所需的大量
sort
函数的开销。。。尽管它确实要求您的系统足够坚固,可以将所有较大的文件加载到内存中进行处理

$ awk -f '

  # populate an array with the contents of the first file only...
  NR==FNR { a[$1]; next; }

  # then delete any array elements that are in the second file...
  { delete a[$1]; }

  # finally, display our results.
  END {
    for (i in a) count++;
    printf("Count: %d entries\n", count);
    for (i in a) printf("%s\n", a[i]);
  }

  ' file2 file1
这里的想法是,我们将逐步通过
文件2
(较长的文件)并将其读入一个数组,然后从
文件
(较短的文件)中删除该数组中显示的所有内容,然后计数并打印剩下的内容

但书#1:如上所述,这要求您有可用的内存将所有
文件2
存储在内存中的数组中。你必须自己决定这是否可行。(也许可以试试看!)


但书2:我没有测试过这个,即使是语法错误。YMMV.)

为了得到一个好的答案,如果您提供一个数据样本和一个您期望作为输出的示例,这将非常有用。如果只是一个长长的数字列表,是不是已经排序了?嗨,Sobrique,文件1包含以下数字:1483 2111 2973 3214 3503 3639 3747 4042 4351 4766 4809 5950 6616 6899 7559 7940 8205 8262 8291文件2包含以下数字:1483 2111 2973 3214 3503 3639 3747 4042 4351 4766 4809 5950 6616 6899 7559 7940 8205 8262 8291 9000 9163 9229 9497 9719 0409 0421 0698 0924 1059。您能将这些编辑到您的问题中吗?看起来像纯数字,按顺序排序。这使问题变得容易多了。数字不是在一行中。它们是一个接一个的,就像在excel sheetOk的列中一样。这就是为什么将输入数据作为样本包含进来很重要。与文件中的外观完全相同(包括换行符)
diff
将在该场景中执行您想要的操作。
$ awk -f '

  # populate an array with the contents of the first file only...
  NR==FNR { a[$1]; next; }

  # then delete any array elements that are in the second file...
  { delete a[$1]; }

  # finally, display our results.
  END {
    for (i in a) count++;
    printf("Count: %d entries\n", count);
    for (i in a) printf("%s\n", a[i]);
  }

  ' file2 file1