使用awk合并2个文件,同时保留所有列,并根据第1列中的匹配添加额外的列

时间:2014-10-30 22:35:52

标签: awk

我有两个包含数千行的文件。每个文件中的第一列都填充了IP地址。我想合并这两个文件,保留两个文件中的所有列,写入第三个文件。我还想在文件中添加一个标题。为了使它更难......如果文件1中的IP在文件2中,那么只需合并这些行,如果没有那么合并行并添加一个新的列,其中包含“添加”,但如果文件2中的IP确实如此不匹配文件1然后将“删除”添加到新列。

文件1扫描仪输出

Column 1    Column 2   Column 3  column 4  
10.1.10.5   nuts.com   2214.53   9/19/2014   
10.1.10.8   sites.net  7233.55   10/24/2010  
10.1.25.6              7611.76   1/24/2010  
10.1.25.7   nobb.com   000.00    9/19/2010  

文件2内部ip列表

Column 1    Column 2  
10.1.10.2   001 T & R  
10.1.10.3   001 T & R  
10.1.25.6   022 office  
10.1.25.7   022 office  

期望的输出
档案3

Column 1    Column 2     Column 3   column 4     column 5     column 6    
10.1.10.2                                        001 T & R    add      
10.1.10.3                                        001 T & R    add   
10.1.10.5   nuts.com     2214.53    9/19/2014                delete    
10.1.10.8   sites.net    7233.55    10/24/2010               delete    
10.1.25.6                7611.76    1/24/2010    022 office      
10.1.25.7   nobb.com     000.00     9/19/2010    022 office      

我已经达到了这个

 awk -F, 'NR==FNR{a[$1]=$2;next} !($1 in a) {$5="Delete"}1 ' OFS="," ipinput.csv scaninput.csv  

但我似乎无法通过添加的列列出所有列。

2 个答案:

答案 0 :(得分:0)

以下awk脚本可以帮助您

 awk 'BEGIN{FS=OFS="|"} NR==FNR{ip[$1]=$2"|"$3"|"$4} NR!=FNR{if ( $1 in ip) {  print $1,ip[$1],$2,"null"; delete ip[$1];} else print  $1,"null|null|null",$2,"add" } END{for ( i in ip ) print i, ip[i],"delete" } '

将输出显示为

10.1.10.2 |null|null|null| 001 T & R|add
10.1.10.3 |null|null|null| 001 T & R|add
10.1.25.6 | null field | 7611.76 | 1/24/2010| 022 office|null
10.1.25.7 | nobb.com | 000.00 | 9/19/2010| 022 office|null
10.1.10.5 | nuts.com | 2214.53 |9/19/2014|delete
10.1.10.8 | sites.net | 7233.55 |10/24/2010|delete

答案 1 :(得分:0)

awk 'BEGIN{FS=OFS=",";print "IP Address","HostName","Vuln Score","Date","Department","Status";} NR==FNR{ip[$1]=$2","$3","$4} NR!=FNR{if ($1 in ip) {  print $1,ip[$1],$2; delete ip[$1];} else print  $1,"\t","\t","\t",$2,"add"; delete ip[$1];} END{for (i in ip) print i,ip[i],"\t","delete"} '  scanoutput.csv ipoutput.csv  > test3.csv

使用nu11p01n73R中的一个很好的例子,我修改了一下以获得我需要的东西。此外,我想在网站上获取它以防万一它可以帮助其他人。再次感谢。

输出

IP Address  HostName   Vuln Score    Date       Department  Status    
10.1.10.2                                        001 T & R    add      
10.1.10.3                                        001 T & R    add   
10.1.25.6                7611.76    1/24/2010    022 office      
10.1.25.7   nobb.com     000.00     9/19/2010    022 office
10.1.10.5   nuts.com     2214.53    9/19/2014                delete    
10.1.10.8   sites.net    7233.55    10/24/2010               delete