Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 查找两个文件之间的匹配项_Regex_File_Awk_Matching - Fatal编程技术网

Regex 查找两个文件之间的匹配项

Regex 查找两个文件之间的匹配项,regex,file,awk,matching,Regex,File,Awk,Matching,我正在尝试使用AWK在2个文件中输出匹配行。我只制作了一列两个文件,它们是电话号码。我发现很多人问了同样的问题,并得到了答案: awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2 我遇到的问题是它根本不想工作。第一个文件很小(~5MB),第二个文件相当大(~250MB)。 我对AWK有一些基本的了解,并且知道上面的脚本应该可以工作,但是我不知道为什么不能 有没有其他方法可以达到同样的效果? GREP是一个很好的工具,但是由于文件大小的原

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

awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
我遇到的问题是它根本不想工作。第一个文件很小(~5MB),第二个文件相当大(~250MB)。 我对AWK有一些基本的了解,并且知道上面的脚本应该可以工作,但是我不知道为什么不能

有没有其他方法可以达到同样的效果? GREP是一个很好的工具,但是由于文件大小的原因,它会阻塞内存并在几秒钟内死亡。 我做了一些抽样检查,以确定是否存在匹配,当我从较小的文件中搜索随机数,并在较大的文件中搜索它们时,我确实找到了匹配项,因此我确信存在匹配项

感谢您的帮助

[根据@Jaypal的要求进行编辑]

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

文件2:

01234642784
02613467246
01234567895
输出:

01234567895
我得到的是:

xxx@xxx:~$ awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
xxx@xxx:~$
更新 问题恰好与您使用的文件类型有关。显然,它来自DOS系统,周围有许多
\r
。要解决此问题,请使用以下方法对其进行“消毒”:

dos2unix

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

grep -f file1 file2
这将查找
file1
中也在
file2
中的行

您可以添加选项以进行更好的匹配:

grep -wFf file1 file2
  • -w
    匹配单词
  • -F
    匹配固定字符串(无正则表达式)
例子
文件太大,无法通过grep运行,工具在得到结果之前就死了。谢谢你的意见!如果你把文件分成几部分呢?我有很多5MB的小文件,把大文件分成几部分会大大增加工作量。如果你把250MB分成两到三部分呢?在Greping上应该不会有问题。这是一个选项,尽管我希望AWK的问题能够得到解决,因为我觉得我将来会想在不同的事情上使用AWK。AWK脚本以什么方式不起作用?你有错误吗?它挂起来了吗?它是否产生了错误的输出?脚本没有输出任何错误,只是思考了一会儿,然后退出。在sdtout和outfile中都尝试过,都返回空。@VaughnCato,也感谢您为我编辑它^^@Qzak我看不出它在250 MB大小时失败的原因。我已经用GBs解析了文件,没有任何问题。请告诉我们您得到的错误?显示两个文件中的一些示例文本和所需的输出。@Qzak感谢您更新问题。我能想到的唯一一件事是,你可能有隐藏的空间或窗口格式。您还可以通过在两个文件名上执行
cat-vet
来输入输出吗?
grep -wFf file1 file2
$ 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