Perl 查找两个文件之间第一列的匹配模式,并在第三个文件中打印每个文件中的行

Perl 查找两个文件之间第一列的匹配模式,并在第三个文件中打印每个文件中的行,perl,sed,awk,Perl,Sed,Awk,例如,我有两个文件,一个包含服务器名和IP,另一个包含服务器名和计算机名。这些文件没有真正的顺序。我尝试过使用Sort、awk和sed的变体。但是第一个文件没有得到很好的维护,并且包含了伪造的数据,这些数据抵消了我的计划 我试图在两个文件之间进行基本的模式匹配,只针对两行中包含的服务器,并在第三个文件的一行中打印两个文件中的行中的数据 文件1: Server1 10.10.10.1 Server2 10.10.10.2 .... Server154 10.10.30.8 Server155 10

例如,我有两个文件,一个包含服务器名和IP,另一个包含服务器名和计算机名。这些文件没有真正的顺序。我尝试过使用Sort、awk和sed的变体。但是第一个文件没有得到很好的维护,并且包含了伪造的数据,这些数据抵消了我的计划

我试图在两个文件之间进行基本的模式匹配,只针对两行中包含的服务器,并在第三个文件的一行中打印两个文件中的行中的数据

文件1:

Server1 10.10.10.1
Server2 10.10.10.2
....
Server154 10.10.30.8
Server155 10.10.30.9
文件2:

Server1 site site1
Server2 site site2
....
Server154 site site154
Server155 site site155
输出:

Server1 10.10.10.1 site site1
Server2 10.10.10.2 site site2
...
Server154 10.10.30.8 site site154
Server155 10.10.30.9 site site155

这应该可以做到:

$ awk 'FNR==NR{a[$1]=$0;next}($1 in a){print a[$1],$2,$3}' file1 file2
Server1 10.10.10.1 site site1
Server2 10.10.10.2 site site2
Server154 10.10.30.8 site site154
Server155 10.10.30.9 site site155

可以通过使用BEGIN中的第一个文件填充数组,然后将第二个文件与该数组匹配来解决此问题

awk -v f1="file1.txt" 'BEGIN { while (getline < f1) { keys[$1]=$2 } ; close(f1) }
   keys[$1] { print }' file2.txt
awk-vf1=“file1.txt”开始{while(getline
工作正常。非常感谢。显然是他们的计时器,我不得不等2分钟,它才会让我,你只是想快点数据这不会产生所需的输出,使用
getline
BEGIN
-v
是不好的做法。所有这一切都是在
file2
中打印行,如果在
file1
中也找到了第一个字段,则不会加入输出。我不同意。使用“-v”的意义在于,我不必在BEGIN语句中写入完整的文件名,只需写入变量。您引用的文章中“应用程序”中的示例c适用于先读取稍后引用的数据,这正是我示例的要点。创建正确的输出格式是操作的一个练习。如果这在stackoverflow上不正确,我会道歉。