我有两个文件:一个包含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名称)。
答案 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