匹配两个文件的内容

时间:2015-08-30 03:08:22

标签: linux bash

我有两个文件:一个包含AP名称列表,另一个列表再次包含AP名称,但这次每个AP的控制器IP都列在AP名称之前。

文件1:

AP1
AP2
Ap3
AP4
Ap5
Ap6
...

文件2:

1.1.1.1,Ap1
2.2.2.2,Ap2
3.3.3.3,Ap3
4.4.4.4,Ap4
6.6.6.6,Ap6
...

如何将文件1中的名称与文件2中的名称进行匹配,以使输出类似于以下内容?

1.1.1.1,Ap1
2.2.2.2,Ap2
3.3.3.3,Ap3
4.4.4.4,Ap4
IP Not Found,Ap5
6.6.6.6,Ap6

我在想我可以使用comm命令,但我不知道只比较名称而不是IP的好方法。我也可以只为每一个名字grep,但这需要永远(大约有8,000个AP名称)。

2 个答案:

答案 0 :(得分:3)

join命令将完成这项工作(请注意,这两个文件必须先按AP名称排序;您的示例数据已经是,但如果您的真实数据不是,请运行第一个通过sort -f提交,第二个文件通过sort -f -t , -k 2)。

join -i -t , -1 1 -2 2 -a 1 -o 2.1,1.1 -e "IP Not Found" file1.txt file2.txt

-i表示忽略大小写,-t ,表示字段用逗号分隔,-1 1表示加入第一个文件的第一个(唯一)字段; -2 2表示连接第二个文件的第二个字段。 -a 1表示包含第一个文件中没有任何匹配项的行。 -o 2.1,1.1指定输出格式:第二个文件(IP)的第一个字段,然后是第一个文件(AP)的第一个字段。 -e "IP Not Found"表示输出" IP Not Found"代替空场。

这将输出

1.1.1.1,AP1
2.2.2.2,AP2
3.3.3.3,Ap3
4.4.4.4,AP4
IP Not Found,Ap5
6.6.6.6,Ap6

答案 1 :(得分:1)

这个awk片段应该这样做:

awk 'BEGIN{FS=","}
     (FNR==NR){a[tolower($2)]=$0}
     (FNR!=NR){if (a[tolower($1)]!="") 
                 print a[tolower($1)]
               else 
                 print "IP Not Found," $1}' file2.txt file1.txt

在你的情况下生产:

1.1.1.1,Ap1
2.2.2.2,Ap2
3.3.3.3,Ap3
4.4.4.4,Ap4
IP Not Found,Ap5
6.6.6.6,Ap6