2016-07-07 47 views
0

bash我用grep -w -f list1.txt list2.txt來搜索列表1名稱到列表2中,它們是一列文件。 現在我需要將這個list1的名字搜索到一個多列文件(一個矩陣,製表符分隔或者csv),我如何得到這個名字和相應的列號?如何在多列中列出一個列表?

的List1是:

SERPINA3 
ADRA1D 
BDNF 
ADSS 

矩陣是:

**CLUST1 CLUST2 CLUST3** 
AAMP A1BG ACACB 
ACADSB A2M ADRA1D 
ACO1 SERPINA3 AK4 
ACP5 ACADM ALDH1A3 
PLIN2 ACR AMD1 
ADORA2B ACO2 ARSB 
ADSL ALAS1 BDNF 
ADSS ALB OSGIN2 

輸出應該是

SERPINA3 CLUST2 
ADRA1D CLUST2 
BDNF CLUST3 
ADSS CLUST1 

感謝。

+0

'awk'是另一種命令行工具,在這種情況下可能比'grep'更合適。 –

+1

是的,對不起@fedorqui,我發佈了示例 – Pltt

回答

1

awk來救援!

$ awk 'NR==FNR{a[$0];next} 
     FNR==1{split($0,h);next} 
       {for(i=1;i<=NF;i++) if($i in a) print $i, h[i]}' file{1,2} 

ADRA1D CLUST3 
SERPINA3 CLUST2 
BDNF CLUST3 
ADSS CLUST1 

你失去了file1的順序,還有其他方法來處理它,不確定它是否重要。

說明

NR==FNR{a[$0];next}店陣列一個第一個文件的記錄,跳過其餘在處理第一個文件

FNR==1{split($0,h);next}現在我們知道這是第二個文件,頭部分裂,陣列^h列名(第一行)的參考,跳過休息

for(i=1;i<=NF;i++)主循環的第二個文件爲ea CH記錄(行)遍歷所有字段

if($i in a)如果任何字段是陣列中一個(即第一文件)

print $i, h[i]}印刷領域和列名(由場號索引)

file{1,2} file1 file2的簡寫形式,您的案例將是List1矩陣

+0

我會殺死那裏的縮進;這三個AWK子句應該(imho)相互對齊,因爲它們處於相同的層次級別(儘管您確實擁有那些「下一個」語句;也許您只是強調了這一點?) –

+0

我將每個條件的操作對齊{行動}塊。這就像在等號中對齊多行方程。 – karakfa

+0

感謝@karakfa,'file1'的順序並不重要,但爲了讓我學習'awk'的使用,您能否指定每行代碼(以及輸入文件名'file1'和'matrix')在哪裏? – Pltt

相關問題