Perl 如何在两个文件之间找到重复值并打印

Perl 如何在两个文件之间找到重复值并打印,perl,awk,Perl,Awk,我有两个文件,一个有一个IP地址(我已经用perl剥离了IP),另一个有更多信息的IP。我需要做一个commpare或使用perl并在每个文件中找到重复的IP。但我需要第二个文件与更多的信息,以保持机智,当发现重复打印第二个文件的整行 文件1内容示例(仅ip无逗号等) 文件2内容示例(找到匹配项时需要打印所有这些信息) 这有点超出我的能力。任何帮助都将不胜感激 谢谢大家! 我假设您有shell访问权限 如果第一个文件仅包含IP,则可以执行以下操作: REF_IP=`cat file1` 然后,

我有两个文件,一个有一个IP地址(我已经用perl剥离了IP),另一个有更多信息的IP。我需要做一个commpare或使用perl并在每个文件中找到重复的IP。但我需要第二个文件与更多的信息,以保持机智,当发现重复打印第二个文件的整行

文件1内容示例(仅ip无逗号等)

文件2内容示例(找到匹配项时需要打印所有这些信息)

这有点超出我的能力。任何帮助都将不胜感激


谢谢大家!

我假设您有shell访问权限

如果第一个文件仅包含IP,则可以执行以下操作:

REF_IP=`cat file1`
然后,您可以使用第二个文件中的grep:

grep "${REF_IP}" file2
结果应该是带有重复地址的行

注意:实际语法可能略有不同(我现在没有访问shell的权限)


HTH

看看这一行,如果它是您想要的:

注意,这将只在文件2中打印一次重复的ip行。还假设文件2中没有重复的IP

 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
kent$head f1 f2

==>f1 f2要匹配第一个字段,只需:

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

如果在文件1中发现重复项3次,则从文件2中打印同一行3次还是仅打印一次?文件2中是否也有重复的IP?如果是如何处理?是的,我正在运行debian 6.0.2。此比较可以比较每个文件中超过30k的ip。比赛应该相对较低。每次低于100@sectech行数并不重要;你必须以任何一种方式读取文件。像
grep
这样的命令对文件读取有自己的优化(以块为单位)。我想最终这取决于你对结果做了什么。。。如果您在perl脚本中处理它,那么您可以在perl脚本中重写上面的两个命令。请看我对@sudo_Os post的回复。我看到@sudo_Os post已被删除,我的评论也已被删除,所以请相信我-不要这样做,这很容易导致错误匹配。谢谢Kent,这是宽容吗,我正在试着消化你写的内容:)因此,如果说没有空间或主机字段有多个标识符,它还会工作吗?它不会返回匹配项,我随机将匹配项从文件1添加到文件2。只要1,您的要求不会改变,2,在文件2中,格式为
ip,foobarbla
Ha,所以我重新创建了f1和f2,当然可以:)我将检查空白。一定是有什么原因导致无法打印dup。非常感谢。在这两个文件中间,我在F1中添加了“1.1.1.1”,在F2 i中添加1.1.1.1,扫描主机RS,Pancevo,44.870800 0183,20.6403007507没有匹配!!????!!!@!sectech该命令在f1中查找重复行,然后从f2打印匹配行,这可能不是填充示例数据文件的方式。在f1中添加第二行,包含1.1.1.1,看看我的意思。这很有效!!!!非常感谢。我发誓这是最好的网站!你们是最棒的!
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
awk -F, 'FNR==NR { a[$1]; next } $1 in a' file1 file2