如何在多列中查找列表?

时间:2016-07-07 14:54:25

标签: bash grep

bash中的

我使用grep -w -f list1.txt list2.txt将list1名称搜索到list2中,它们是一列文件。 现在我需要将这个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

感谢。

1 个答案:

答案 0 :(得分: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}将第一个文件的记录存储在数组 a 中,在处理第一个文件时跳过其余文件

FNR==1{split($0,h);next}现在我们知道它是第二个文件,将标题拆分为数组 h 以引用列名(第一行),跳过休息

每个记录(行)的第二个文件的

for(i=1;i<=NF;i++)主循环遍历所有字段

if($i in a)如果数组中有任何字段 a (即第一个文件)

print $i, h[i]}打印字段和列名称(由字段编号索引)

file1 file2的

file{1,2}简写,你的案例将是List1 Matrix