Regex 查找两个文件之间的匹配项
我正在尝试使用AWK在2个文件中输出匹配行。我只制作了一列两个文件,它们是电话号码。我发现很多人问了同样的问题,并得到了答案: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 '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