2015-10-05 92 views
0

我想比較兩個列表並從一個列表中打印一些列,如果兩個匹配,則打印一些列。我懷疑我很接近,但我想這是最好檢查..比較兩個列表並從每個列表中打印選擇列

一號文件:DATA.TXT

101 0.123 
145 0.119 
242 0.4 
500 0.88 

第二個文件:的map.txt

red 1 99  
blue 3 101 
rob 3 240 
ted 7 500 

所以,如果我想比較文件2的第3列和文件1的第1列並打印文件2的第1列和文件1的全部,我試過awk 'NR==FNR {a[$3];next}$1 in a{print$0}' file2 file1

但是隻打印file1中的匹配。我嘗試在awk中添加x=$1。即awk 'NR==FNR {x=$1;a[$3];next}$1 in a{print x $0} file2 file1,但是隻保存一個值$1並且每行輸出該值。我也嘗試在a[$3]中加入1美元,這顯然是錯誤的,從而產生零輸出。

理想情況下,我想獲得這個輸出:

blue 145 0.119 
ted 500 0.88 

這是文件2的第1列和匹配文件1的第一列文件2的第3列,文件1的其餘部分。

回答

1

你在第二次嘗試中就已經完成了。只需將$1的值分配給標量,您可以將其存儲在數組中以備後用。

awk 'NR==FNR {a[$3]=$1; next} $1 in a {print a[$1], $0}' file2.txt file1.txt 

$ cat file1.txt 
101 0.123 
145 0.119 
242 0.4 
500 0.88 

$ cat file2.txt 
red 1 99 
blue 3 101 
rob 3 240 
ted 7 500 

$ awk 'NR==FNR {a[$3]=$1; next} $1 in a {print a[$1], $0}' file2.txt file1.txt 
blue 101 0.123 
ted 500 0.88 
+1

啊哈..我錯過了=在[$ 3] ...我想知道爲什麼在打印沒有工作... – Turtle

+1

@Turtle前添加[$ 1] $ 1 - 你可能想要花點時間真正想想這個解決方案,因爲你顯然認爲如果沒有早期填充它[a [$ 1]'就會以某種方式包含你想要的東西,並且通過在創建數組索引後爲某個不同的變量賦值('a [$ 3]; b = $ 1'),這會以某種方式將變量'b'與'a []'的內容相關聯。 awk中的數組是一個非常常用和強大的工具,在處理更復雜的問題之前,理解這個非常基礎的應用程序非常重要。我建議你獲得Arnold Robbins的第四版Effective Awk Programming。 –