2015-08-30 76 views
0

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

回答

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”而不是空字段。

这将输出

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

或者,只是将数据加载到SQLite和做整个事情与一个查询:) – hobbs

+0

也可以添加-e“IP未找到” – amdixon

+0

@amdixon哦,很好!我没有看到那一个。将更新。 – hobbs

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 
+0

谢谢!工作得很好 – lacrosse1991

相关问题