2015-10-21 38 views
0

我一直在尝试3天,试图了解如何使用AWK为我提供我期待的结果。让我首先说我不是程序员,充其量只是新手。我看过大约30种不同的方式来做我想做的事情,但他们要么不是完全匹配的,我必须改变事情,他们不工作,或者从一开始就不工作。使用AWK查找2个CSV文件中的数据

目标:比较2个CSV文件并将数据导出到另一个CVS文件。我需要查看文件1(标题为sampleData)中第2列或第3列中的任何Mac地址是否显示文件2中的第2列(标题为sampleLeases),然后从文件2列出第1列,即匹配的mac地址,以及文件2中的第1列。

我的问题可能源于我对AWK中关联数组的误解,但我试图在旅途中学习,并且需要帮助。

我已经尝试过这其中许多other.Sorry为长期发布,我只是想尽可能彻底。以下是一组样本数据。

sampleLeases.csv

10.1.2.3,00:11:22:33:44:55 
10.1.2.4,00:11:22:33:44:56 
10.1.2.5,00:11:22:33:44:57 
10.1.2.6,00:11:22:33:44:58 
10.1.2.7,00:11:22:33:44:59 
10.1.2.8,00:11:22:33:44:60 
10.1.2.9,00:11:22:33:44:61 
10.1.2.10,00:11:22:33:44:62 
10.1.2.11,00:11:22:33:44:63 
10.1.2.12,00:11:22:33:44:64 
10.1.2.13,00:11:22:33:44:65 
10.1.2.14,00:11:22:33:44:66 
10.1.2.15,00:11:22:33:44:67 
10.1.2.16,00:11:22:33:44:68 
10.1.2.17,00:11:22:33:44:69 
10.1.2.18,00:11:22:33:44:70 
10.1.2.19,00:11:22:33:44:71 
10.1.2.20,00:11:22:33:44:72 
10.1.2.21,00:11:22:33:44:73 

sampleData.csv

comp. name,mac address,mac address 2,os version,S/N,dept.,building,asset number 
bldg1-rm200-01,00:11:22:33:44:55,22:33:44:55:66:77,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-02,11:22:33:44:56:44,00:11:22:33:44:56,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-03,00:11:22:33:44:57,22:33:44:55:66:79,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-04,00:11:22:33:44:58,22:33:44:55:66:80,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-05,11:22:33:44:59:45,00:11:22:33:44:60,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-06,00:11:22:33:44:61,22:33:44:55:66:82,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-07,11:22:33:44:61:45,00:11:22:33:44:62,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-08,00:11:22:33:44:63,22:33:44:55:66:84,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-09,00:11:22:33:44:64,22:33:44:55:66:85,Osversion,98745562,cart,main,6587521336 
bldg1-rm200-10,00:11:22:33:44:65,22:33:44:55:66:86,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-11,11:22:33:44:65:56,00:11:22:33:44:66,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-12,11:22:33:44:66:56,00:11:22:33:44:67,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-13,11:22:33:44:67:20,00:11:22:33:44:68,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-14,11:22:33:44:68:34,00:11:22:33:44:69,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-15,00:11:22:33:44:70,22:33:44:55:66:91,Osversion,98745562,lab,main,6587521336 
bldg1-rm200-16,11:22:33:44:70:59,00:11:22:33:44:71,Osversion,98745562,lab,main,6587521336 

所需的输出格式

bldg1-rm200-01,00:11:22:33:44:55,10.1.2.3 

比KS。

编辑:

我试着通过karkafa和Xorg建议的两种方法,我没有收到任何输出。我附上了一张屏幕截图,其中显示了我的Awk版本(实际上是GNU Awk)和Linux内核版本,以防万一它相关。我使用Linux Mint 17.2 Rafaela来测试我的AWK脚本。 Screenshot showing no AWK output.

+0

你是在正确的轨道上,检查我的答案,并尝试修复你的代码。 – karakfa

+0

@karakfa谢谢你们花时间看我的问题。虽然我尝试使用这两种方法,但没有收到任何输出,但我似乎遭受了更大的问题。我添加了截图到我原来的发布。 – user3792046

+0

和@Xorg,上述声明是为两者而设计的。 – user3792046

回答

3

AWK救援

$awk -F, -v OFS=, 'NR==FNR{a[$3]=a[$2]=$1;next} $2 in a{print a[$2],$2,$1}' file2 file1 

将打印

bldg1-rm200-01,00:11:22:33:44:55,10.1.2.3 
bldg1-rm200-02,00:11:22:33:44:56,10.1.2.4 
bldg1-rm200-03,00:11:22:33:44:57,10.1.2.5 
bldg1-rm200-04,00:11:22:33:44:58,10.1.2.6 
bldg1-rm200-05,00:11:22:33:44:60,10.1.2.8 
bldg1-rm200-06,00:11:22:33:44:61,10.1.2.9 
bldg1-rm200-07,00:11:22:33:44:62,10.1.2.10 
bldg1-rm200-08,00:11:22:33:44:63,10.1.2.11 
bldg1-rm200-09,00:11:22:33:44:64,10.1.2.12 
bldg1-rm200-10,00:11:22:33:44:65,10.1.2.13 
bldg1-rm200-11,00:11:22:33:44:66,10.1.2.14 
bldg1-rm200-12,00:11:22:33:44:67,10.1.2.15 
bldg1-rm200-13,00:11:22:33:44:68,10.1.2.16 
bldg1-rm200-14,00:11:22:33:44:69,10.1.2.17 
bldg1-rm200-15,00:11:22:33:44:70,10.1.2.18 
bldg1-rm200-16,00:11:22:33:44:71,10.1.2.19 
0

与代码一些细分的另一种方式...... 假设你有下面的一个名为代码awkscript

BEGIN{FS=OFS=","} 
#store field two in sampleLeases.csv as mac array 
#store field one in sampleLeases.csv as ip array 
FNR==NR {mac[$2]=$2;ip[$2]=$1;next} 
{if($2 in mac){ 
    print $1,mac[$2],ip[$2] 
    } 
{if($3 in mac){ 
    print $1,mac[$3],ip[$3] 
    } 
}} 

run script like

awk -f awkscript sampleLeases.csv sampleData.csv