查找2个文件之间的匹配项

时间:2014-03-06 14:58:48

标签: regex file awk matching

我正在尝试使用AWK输出2个文件中的匹配行。我只用一列制作2个文件就更容易了,它们就是电话号码。我发现很多人都在问同样的问题并得到答案:

awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2

我遇到的问题是它根本不想工作。第一个文件很小(~5MB),第二个文件相当大(~250MB)。 我对AWK有一些一般的了解,并且知道上面的脚本应该可以工作,但是我无法弄清楚它为什么不是。

还有其他方法可以达到相同的效果吗? GREP是一个很好的工具,但由于文件大小,它会阻塞RAM并在几秒钟内死掉。 我确实运行了一些抽查,以确定是否有匹配,当我从较小的文件中获取随机数字的grep并通过较大的文件grep他们我确实找到了匹配,所以我确信有

感谢任何帮助!

[按照@Jaypal的要求编辑]

两个文件的示例代码: 文件1:

01234567895
01234577896
01234556894

文件2:

01234642784
02613467246
01234567895

输出:

01234567895

我得到了什么:

xxx@xxx:~$ awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
xxx@xxx:~$

1 个答案:

答案 0 :(得分:1)

更新

问题恰好与您使用的文件类型有关。显然它来自DOS系统并且周围有许多\r。要解决这个问题,请使用以下方法对其进行“消毒”:

dos2unix

以前的回答

你的awk非常好。但是,您也可以将文件与grep -f进行比较:

grep -f file1 file2

这将在file1中查找file2中的行。

您可以添加选项以实现更好的匹配:

grep -wFf file1 file2
  • -w匹配字词
  • -F匹配固定字符串(无正则表达式)。

实施例

$ cat a
hello
how are
you
I am fine areare
$ cat b
hel
are

$ grep -f b a
hello
how are
I am fine areare

$ grep -wf b a
how are