2016-07-07 49 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

相关问题