2016-05-31 58 views
0

我有两个文件都有IP地址列表,mac和不同列中的说明。一些IP地址在两个文件中。我想通过IP地址加入这些文件,以便输出文件具有: 1)来自两个文件的所有IP地址和 2)在两个文件中列出的任何IP后面都有4个列,每列包含mac和描述。通过IP地址加入文件

文件1:

11.16.31.13  00:a0:c8:b5:c2:d5 keshav-ae1.0 
10.16.31.17  f0:ad:4e:01:c5:c8 keshav-ge-2/1/5.0 
108.16.31.3  4c:96:14:5d:5f:f0 keshav-ae0.0 
108.16.31.4  00:0a:9c:52:74:b2 keshav-ae1.0 
27.16.32.1  00:00:5e:00:01:4c keshav-ae0.0 

文件2:

192.16.31.10  00:25:90:cd:4e:3c keshav-ae0.0 
10.16.31.17  f0:ad:4e:01:c5:c8 keshav-ae0.0 
17.16.31.2  b0:a8:6e:28:87:f0 keshav-ae0.0 
108.16.31.4  00:0a:9c:52:74:b2 keshav-ae0.0 
10.16.31.5  2c:36:f8:ce:65:42 keshav-ae0.0 

输出文件应该是:

11.16.31.13  00:a0:c8:b5:c2:d5 keshav-ae1.0 
10.16.31.17  f0:ad:4e:01:c5:c8 keshav-ge-2/1/5.0 f0:ad:4e:01:c5:c8 keshav-ae0.0 
108.16.31.3  4c:96:14:5d:5f:f0 keshav-ae0.0 
108.16.31.4  00:0a:9c:52:74:b2 keshav-ae1.0 00:0a:9c:52:74:b2 keshav-ae0.0 
27.16.32.1  00:00:5e:00:01:4c keshav-ae0.0 
192.16.31.10 00:25:90:cd:4e:3c keshav-ae0.0 
17.16.31.2  b0:a8:6e:28:87:f0 keshav-ae0.0 
10.16.31.5  2c:36:f8:ce:65:42 keshav-ae0.0 

我曾尝试加入与排序文件(“sort -n”或“sort -n -t。 -k 1,1 -k 2,2 -k 3,3 -k 4,4" ),但它不是给所需的输出

sort -n file1 > file3 
sort -n file2 > file4 
join -j 1 -a 1 -a 2 -e UNKNOWN file3 file4 > output 

和输出文件看起来如下:

10.16.31.17 f0:ad:4e:01:c5:c8 keshav-ge-2/1/5.0 f0:ad:4e:01:c5:c8 keshav-ae0.0 
10.16.31.5 2c:36:f8:ce:65:42 keshav-ae0.0 
11.16.31.13 00:a0:c8:b5:c2:d5 keshav-ae1.0 
17.16.31.2 b0:a8:6e:28:87:f0 keshav-ae0.0 
108.16.31.4 00:0a:9c:52:74:b2 keshav-ae0.0 
192.16.31.10 00:25:90:cd:4e:3c keshav-ae0.0 
27.16.32.1 00:00:5e:00:01:4c keshav-ae0.0 
108.16.31.3 4c:96:14:5d:5f:f0 keshav-ae0.0 
108.16.31.4 00:0a:9c:52:74:b2 keshav-ae1.0 
+0

'AWK '{A [$ 1] =α[$ 1] “ ”$ 2“” $ 3} END {对于(I a)中的{打印IA [I]}}' file1的file2' – anishsane

+0

由于@anishsane 。有用!你能解释一下吗? –

回答

0

如果你想保持你的除外输出的顺序,你可以试试这个

awk 'ARGIND<3{dic[$1]=dic[$1]" "$2" "$3}ARGIND>=3 && !($1 in a){print $1dic[$1];a[$1]}' file1 file2 file1 file2 

输出

11.16.31.13 00:a0:c8:b5:c2:d5 keshav-ae1.0 
10.16.31.17 f0:ad:4e:01:c5:c8 keshav-ge-2/1/5.0 f0:ad:4e:01:c5:c8 keshav-ae0.0 
108.16.31.3 4c:96:14:5d:5f:f0 keshav-ae0.0 
108.16.31.4 00:0a:9c:52:74:b2 keshav-ae1.0 00:0a:9c:52:74:b2 keshav-ae0.0 
27.16.32.1 00:00:5e:00:01:4c keshav-ae0.0 
192.16.31.10 00:25:90:cd:4e:3c keshav-ae0.0 
17.16.31.2 b0:a8:6e:28:87:f0 keshav-ae0.0 
10.16.31.5 2c:36:f8:ce:65:42 keshav-ae0.0 

说明

ARGIND<3意味着下面的语句{dic[$1]=dic[$1]" "$2" "$3}将只处理前2个输入文件,并声明{dic[$1]=dic[$1]" "$2" "$3}只是把数据放到字典(在Python中)或映射(在C++/Java等)dic通过使用IP作为关键和MAC描述为V alues。

ARGIND>=3测得以下语句{print $1dic[$1];a[$1]}将处理其他文件排除前2个文件。 !($1 in a)表示不在字典a中的密钥,以便输出不会重复。声明{print $1dic[$1];a[$1]}只是打印ip,mac,description并更新IP到字典a

第三个和第四个参数在这里只是扫描文件的关键,以便结果可以输出为你想要的。


如果你只是想加入该表,并不在意输出的顺序,你可以只使用

awk '{dic[$1]=dic[$1]" "$2" "$3}END{for(item in dic) print item""dic[item]}' file1 file2

输出

17.16.31.2 b0:a8:6e:28:87:f0 keshav-ae0.0 
192.16.31.10 00:25:90:cd:4e:3c keshav-ae0.0 
108.16.31.3 4c:96:14:5d:5f:f0 keshav-ae0.0 
108.16.31.4 00:0a:9c:52:74:b2 keshav-ae1.0 00:0a:9c:52:74:b2 keshav-ae0.0 
10.16.31.5 2c:36:f8:ce:65:42 keshav-ae0.0 
27.16.32.1 00:00:5e:00:01:4c keshav-ae0.0 
11.16.31.13 00:a0:c8:b5:c2:d5 keshav-ae1.0 
10.16.31.17 f0:ad:4e:01:c5:c8 keshav-ge-2/1/5.0 f0:ad:4e:01:c5:c8 keshav-ae0.0 

说明 声明{dic[$1]=dic[$1]" "$2" "$3}做同样的事情(将日期放到字典dic中),并且语句END{for(item in dic) print item""dic[item]}意味着在处理每个输入文件之后,对于字典中的每个键item执行打印键和值。

+0

因为我可以稍后排序,所以不需要排序ip。我只想要最简单的命令来加入这两个表格。 –

+0

我的意思是,你想要的结果保持你的例外输出的顺序。 – kemiya

0
awk '!/^$/{ if(!a[$1]){a[$1]=$1"\t"$2"\t"$3} else {a[$1]=a[$1]"\n\t\t"$2"\t"$3} } END { for(i in a) print a[i] }' f1 f2 

输出:

17.16.31.2  b0:a8:6e:28:87:f0  keshav-ae0.0 
192.16.31.10 00:25:90:cd:4e:3c  keshav-ae0.0 
108.16.31.3  4c:96:14:5d:5f:f0  keshav-ae0.0 
108.16.31.4  00:0a:9c:52:74:b2  keshav-ae1.0 
       00:0a:9c:52:74:b2  keshav-ae0.0 
10.16.31.5  2c:36:f8:ce:65:42  keshav-ae0.0 
27.16.32.1  00:00:5e:00:01:4c  keshav-ae0.0 
11.16.31.13  00:a0:c8:b5:c2:d5  keshav-ae1.0 
10.16.31.17  f0:ad:4e:01:c5:c8  keshav-ge-2/1/5.0 
       f0:ad:4e:01:c5:c8  keshav-ae0.0 
0

awk应该有所帮助:

awk '{a[$1]=a[$1]" "$2" "$3}END{for (i in a){print i a[i]}}' file1 file2 

说明:对于每一个IP地址,记录MAC地址&描述。 (如果有,请将其附加到已存在的条目中。)&最后打印所有内容。

如果您希望按IP地址排序数组,请在for循环之前添加PROCINFO["sorted_in"]="@ind_num_asc"

awk '{a[$1]=a[$1]" "$2" "$3}END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a){print i a[i]}}' file1 file2