2015-10-21 39 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