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
感谢。
答案 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]}
打印字段和列名称(由字段编号索引)
file{1,2}
简写,你的案例将是List1 Matrix