2013-02-27 74 views
1

我一直在使用這一問題的建議: Find value from one csv in another one (like vlookup) in bash (Linux)VLOOKUP風格查詢循環(

要嘗試並創建一個腳本,我通過多個數據文件,並在VLOOKUP風格的方式添加列從幾個其他(單個)的參考文件。

數據文件的例子(*。數據)

info1 7 44567 1 2 marker1 
info2 3 143679 2 2 marker2 

參考文件的例子(ref.txt,文件從查找)

marker1  66% 
marker2  34% 

第二參考文件的例子(ref2.txt,第二文件以從查找)

info1  exact 
info2  partial

輸出所需

info1 7 44567 1 2 marker1 66% exact 
info2 3 143679 2 2 marker2 34% partial 

試圖環路(僅示出一個參考文件,因爲我還沒有那個工作呢!)

#!/bin/bash 
for file in `ls /path/*.data`; 
do 
for i in $file; 
do 
KEY=$(cut -f 6 $file); 
    printf "%s\t" $i; 
    grep "${KEY}" /path/ref1.txt | cut -f 2 ; 
done 
done 

我認爲我寫的腳本存在兩個問題 輸出當前是每個輸入文件一行,而不是輸入文件的所有行追加,它是文件的文件名,而不是一行在文件中。雖然參考位似乎正在工作(從我可以告訴單行輸出)。 I,E:

/path/1.data 66% 

誰能告訴我什麼錯誤,或者請提出一個聰明的方式來做到這一點? 非常感謝。

回答

2

這裏有一個join實用程序。特別是,舉個例子:

join -o 1.1,1.1,1.3,1.4,1.5,1.6,2.2 -1 6 -2 1 test.data ref.txt | 
    join -o 1.1,1.1,1.3,1.4,1.5,1.6,1.7,2.2 -j 1 - ref2.txt 

這會產生你的建議輸出。 -o <list>選項指定要以<filenumber>.<fieldnumber>格式打印的每個字段。 -1 <n>-2 <n>指定要在每個文件中分別匹配哪個字段,-j <n>是兩個文件中字段號相同時可以使用的快捷方式。

+0

這真的很有用,謝謝。比循環複雜得多(雖然乍一看有點令人生畏!) – jksl 2013-02-27 22:27:36

+0

這是一個很多的輸入...爲了使它更短一點,你可以'join -1 6 -2 1 test.data ref .txt |加入-j 1 - ref2.txt',但輸出的順序與你想要的順序有所不同。這可以很容易地通過'awk'中的後處理步驟來糾正,或者如果它很重要的話。 – twalberg 2013-02-28 01:59:31

+0

我可以問,這是否排除沒有共享密鑰的條目?我可能不得不發佈另一個問題,但會有一種方法來放置一個空格或0,如果沒有條目匹配ref文件中的數據文件?謝謝。 – jksl 2013-02-28 09:12:48