繁体   English   中英

匹配两个文件的内容

[英]Match up the contents of two files

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

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

这个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM