2013-02-14 70 views
0

我有两个文件,一个带有一个IP地址(我已经使用perl去除IP),另一个带有更多信息的ip。我需要做一个commpare或使用perl,并在每个文件中找到重复的IP。但我需要更多信息的第二个文件保持完整,并且当找到重复项时,打印第二个文件的整行。如何在两个文件之间找到重复的值并打印

文件1的内容例如(不仅仅是IP没有逗号等)

114.42.141.131 

file2的内容例如(需要所有这些信息打印时发现匹配)

114.42.141.131,Host TW,Taipei,25.0391998291,121.525001526 

这是一个小超出我的技能。任何帮助将不胜感激!!!

谢谢!

+0

如果重复被发现在文件1〜3次,打印同一行次或只有一次? file2中是否有重复的ips?如果是,如何处理? – Kent 2013-02-14 14:57:12

回答

2

要匹配的第一个字段,你需要的是:从文件2 3

awk -F, 'FNR==NR { a[$1]; next } $1 in a' file1 file2 
+0

工作正常!谢谢!!!!!!!我发誓这是最好的站点!你们是最棒的! – sectech 2013-02-14 17:46:34

0

我假设你有shell访问权限。

如果第一个文件只包含IP,那么你可以这样做:

REF_IP=`cat file1` 

然后,您可以使用grep从第二个文件:

grep "${REF_IP}" file2 

结果应该是与重复的地址一致。

注:实际语法可能会略有不同(我没有马上访问shell)

HTH

+0

是的,我在运行debian 6.0.2。这个比较可以比较每个文件中超过30k的IP。比赛应该相对较低。低于100点。 – sectech 2013-02-14 14:59:21

+0

@sectech行数并不重要;你必须以任何方式阅读文件。像'grep'这样的命令有自己的文件读取优化(以块为单位)。我想最终它取决于你如何处理结果......如果你正在使用perl脚本处理它,那么你可以在perl脚本中重写上面的两个命令。 – 2013-02-14 15:03:51

+0

不要这样做。查看我对@sudo_Os帖子的回应。 – 2013-02-14 15:29:28

0

看看这个oneliner,如果是你想要什么:

注意,这将只在file2中复制ip行一次。还假定file2中没有重复的ips。

awk -F, 'NR==FNR{p[$1]=$0;next}{a[$0]++}END{for(x in a)if (a[x]>1)print p[x]}' file2 file1 

小测试:

kent$ head f1 f2 
==> f1 <== 
1.1.1.1 
1.1.1.1 
1.1.1.1 
2.2.2.2 

==> f2 <== 
1.1.1.1,Host TW,Taipei,25.0391998291,121.525001526 
2.2.2.2,this is for 2.2. 

kent$ awk -F, 'NR==FNR{p[$1]=$0;next}{a[$0]++}END{for(x in a)if (a[x]>1)print p[x]}' f2 f1 
1.1.1.1,Host TW,Taipei,25.0391998291,121.525001526 
+0

谢谢肯特,所以这是宽容的,我试图消化你写的东西:)所以如果有说不存在空间或主机字段有多个标识符它仍然工作?它没有返回匹配,并且我已经随机添加了从file1到file2的匹配。 – sectech 2013-02-14 15:06:19

+0

它将工作,只要1,您的要求不会改变,2,在file2中,格式是'ip,foobarbla' – Kent 2013-02-14 15:08:28

+0

哈,所以我重新创建了你的f1和f2,当然它工作:)即时通讯将检查空格..必须有东西导致这个不打印dup。谢谢! – sectech 2013-02-14 15:24:55

相关问题