我有一个大矩阵,其中第一行包含变量名称,第一列包含对象的名称(变量和对象是相同的,它是所有与所有的比较)。此外,我有两个不同的文本文件。第一个 ( file1.txt
) 包含感兴趣的对象(我应该使用此文件根据矩阵第一列中报告的名称对象来选择感兴趣的行),而第二个文件 ( list.txt
) 包含较短的对象列表,并且我应使用此列表来选择以列表中报告的对象名称开头的矩阵的相关列。目的是使用这两个txt文件提取矩阵中的相对分数。
例如matrix.txt:(列由制表符分隔)
Object 3mup_A_001_____ 3oz1_A_001_____ 456r_V_002_____ 23er_B_001_____ 87t5_C_001_____
23er_B_001_____ 0.5 0.3 0.87 1 0.9
456r_V_002_____ 0.2 0.7 0.65 0.63 0.2
87t5_C_001_____ 0.35 0.5 0.254 0.12 1
dret_A_009_____ 0.99 0.88 0.7 0.89 0.214
3mup_A_001_____ 0.12 0.15 0.87 0.17 0.87
文件1.txt:
87t5_C_001_____
列表.txt:
3mup_A_001_____
456r_V_002_____
我应该使用file1.txt
(87t5_C_001____) 选择第一列中感兴趣的对象(选择矩阵的第 4 行),并获得以文件中包含的对象名称开头的列(变量)关联的分数list.txt
。
输出.txt
Object 3mup_A_001_____ 456r_V_002_____
87t5_C_001_____ 0.35 0.254
作为替代方案,如果更简单,输出也可以采用其他格式,例如报告列表中对象附近的分数:
3mup_A_001_____ 0.35
456r_V_002_____ 0.254
我希望它很清楚,并且有人可以帮助我,因为我不知道如何进行此操作。
谢谢。
答案1
$ cat tst.awk
BEGIN { FS=OFS="\t" }
FILENAME == ARGV[1] {
rowNames[$1]
next
}
FILENAME == ARGV[2] {
colNames[$1]
next
}
FNR == 1 {
rowNames[$1]
colNames[$1]
for (i=1; i<=NF; i++) {
if ($i in colNames) {
f[++numCols] = i
}
}
}
$1 in rowNames {
for (colNr=1; colNr<=numCols; colNr++) {
printf "%s%s", $(f[colNr]), (colNr<numCols ? OFS : ORS)
}
}
$ awk -f tst.awk file1.txt list.txt matrix.txt
Object 3mup_A_001_____ 456r_V_002_____
87t5_C_001_____ 0.35 0.254