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

时间:2015-03-18 13:42:13

标签: 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 

文件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进行比较,但我的笔记本电脑多次进入挂状态。另外,我在UNIX中尝试使用diff命令,但未达到预期的输出。 请有人帮我在UNIX中解决这个问题,因为它比其他方法花费的时间更短。

2 个答案:

答案 0 :(得分:1)

file 2中的数据未完全排序;最后有一些数字以0和1开头。因此,您确实需要对数字进行排序,然后您可以将comm与Bash(Korn shell,Z Shell)和process substitution一起使用:

comm <(sort file.1) <(sort file.2)

这将打印仅在第1列中显示在file.1中的数字,仅在第2列中显示在file.2中的数字(由选项卡缩进),以及第3列中显示的数字(缩进)通过两个标签)。

您可以使用-23选项取消第2列和第3列,只留下file.1中的数字:

comm -23 <(sort file.1) <(sort file.2)

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

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

如果您没有进程替换,则需要单独对这两个文件进行排序。如果您不再需要原始订单中的原始文件,则可以使用:

sort -o file.1 file.1
sort -o file.2 file.2
comm -23 file.1 file.2 | wc -l

替代方案很多。

答案 1 :(得分:1)

Awk也可以为解决这个问题提供一些选择。这是一个。

此解决方案没有按照sort解决方案的要求运行几个大量comm函数的开销,而bash进程替换...虽然它确实要求您的系统是足够强大,可以将所有较大的文件加载到内存中进行处理。

$ 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

这里的想法是,我们将逐步浏览file2(较长的文件)并将其插入数组,然后我们从file中出现的数组中移除所有内容(较短的文件),然后计算并打印剩下的内容。

Proviso#1:如上所述,这要求您有可用内存将所有file2存储在内存中的数组中。您必须自行确定这是否可行。 (也许通过尝试!)

Proviso#2:我还没有测试过这个,即使是语法错误也是如此。因人而异。 :)