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