2014-08-31 106 views
-1

我想比較基於公共列的兩個文件(第一個文件中的$ 2和第二個文件中的$ 4),並從兩個文件中打印匹配的記錄,但是與awk,我正在使用的是,它只打印第二個文件的記錄。需要幫助理解awk命令來結合兩個文件

任何人都可以提供解決方案嗎? file1的

111,abc 
222,abc 
111,bcd 

file2的

1,123,345,abc 
2,234,232,bcd 
2,hhh,343,bcd 

期望的輸出:

111,abc,1,123,345,abc 
222,abc,1,123,345,abc 
111,bcd,2,234,232,bcd 
111,bcd,2,hhh,343,bcd 

與下面AWK指令i得到輸出中這樣

awk -F, 'NR==FNR {a[$2];next } (($4) in a) {print $0","a[$1]}' file file2 
1,123,345,abc, 
2,234,232,bcd, 
2,hhh,343,bcd, 

不getitng在任何值一個[$ 1]在輸出中。

+0

你能否讓你的標題更具描述性?你能正確地格式化你的代碼嗎? – djechlin 2014-08-31 12:57:02

+0

可能'awk'不是這裏最好的工具,你可以試試'join'。此外,請注意匹配行上的邏輯有點模糊,因爲要打印與file1上的第4列匹配的所有內容,所以最好先存儲file2,然後在file1中循環打印所需的值。 – fedorqui 2014-08-31 13:03:15

回答

1

讓我開始說你永遠不會用你開始的方法得到那個輸出。不要忘記Ed在他的文章中提出的更正,但是您使用的是重複的列作爲鍵。當你這樣做時,該鍵所保存的初始值會丟失並被最近看到的值所取代。

要實現該輸出,您應該做的是創建一個獨一無二的複合鍵。下面是我該怎麼做:

awk ' 
BEGIN { FS = OFS = "," }   # Set your input and output separator in BEGIN block 
NR==FNR { line[$0]; next }  # Load the entire line as key as columns can repeat 
{ 
    for (key in line) {   # Iterate through your array 
     split (key, arry, /,/); # Split your key on "," and store in an array 
     if (arry[2] == $4) {  # If that key is matching your column 4 
      print key, $0   # Print the entire key long with entire line from file2 
     } 
    } 
}' file1 file2 
111,abc,1,123,345,abc 
222,abc,1,123,345,abc 
111,bcd,2,234,232,bcd 
111,bcd,2,hhh,343,bcd 
+1

爲解決方案+1,但如果OP無法確定是使用'$ 1'還是'$ 4'來訪問數組內容(並且它們不能都是正確的),那麼我不確定它們'即使所有的評論都很好!希望他們會提出問題... – 2014-08-31 14:55:43

+1

@EdMorton這就是我將它們指向你並逃避到被遺忘的地方。 ':P' – 2014-08-31 15:03:05

+0

謝謝Jaypal。但是我的問題是爲什麼我無法使用awk -F,'NR == FNR {a [$ 2]; next}(($ 4)a){print $ 0「,」一個[$ 1]}文件file2。這個聲明有什麼問題? – unixuser 2014-08-31 15:25:43

0

你需要設置你的FSOFS變量告訴awk中你的領域是逗號分隔(見awk的手冊頁),以及正在使用的第二場從文件1(如abc),因爲它是指數填充a[],然後當測試它時,您使用的是文件中的$ 4(例如abc),這似乎是合理的,但在打印時,您嘗試使用file2中的第一個字段(例如1)訪問其內容,因爲它是索引。考慮一下。

+0

嗨,在awk語句中添加了一個字段分隔符(,)。你可以請現在檢查嗎? – unixuser 2014-08-31 13:17:24

+0

修復其他的東西,然後我會檢查。 – 2014-08-31 13:19:08