【问题标题】:Find matches between 2 files查找 2 个文件之间的匹配项
【发布时间】:2014-04-09 07:16:50
【问题描述】:

我正在尝试使用 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:~$

【问题讨论】:

  • awk 脚本在什么情况下不起作用?你有错误吗?会挂吗?它会产生错误的输出吗?
  • 脚本没有输出任何错误,只是想了一会儿,退出了。尝试进入 sdtout 和 outfile,都返回空。
  • @VaughnCato 另外,感谢您为我编辑它^^
  • @Qzak 我看不出它在 250 MB 大小时会失败的任何原因。我已经解析了 GB 中的文件,没有任何问题。请告诉我们您遇到的错误?显示两个文件中的一些示例文本和您想要的输出。
  • @Qzak 感谢您更新问题。我唯一能想到的是你可能有隐藏的空格或窗口,如格式化。您还可以通过在两个文件名上执行cat -vet 来放置输出吗?

标签: regex file awk matching


【解决方案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

【讨论】:

  • 文件太大而无法通过 grep 运行,该工具在得到结果之前就死了。不过感谢您的意见!
  • 如果你把文件分成几块呢?
  • 我有很多 5MB 的小文件,拆分大文件会显着增加工作量。
  • 如果你把 250MB 分成两三个呢? grepping 应该没有问题。
  • 这是一个选项,尽管我希望 AWK 的问题能够得到解决,因为我觉得我将来想将 AWK 用于不同的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2017-08-06
  • 2021-06-23
相关资源
最近更新 更多