Awk 如何从选定的列和行中筛选值?

Awk 如何从选定的列和行中筛选值?,awk,Awk,如何使用ids.1文件中的行名称和ids.2文件中的列名从输入文件中筛选值 样本输入 name s1 s2 s3 s4 a1 7 8 7 8 a2 7 54 7 8 a3 8 8 8 8 a4 7 7 7 0 name s3 s4 a1 7 8 a4 7 0 ids.1 name a1 a4 ids.2 name s3 s4 样本输出 name s1 s2 s3 s4 a1 7 8

如何使用ids.1文件中的行名称和ids.2文件中的列名从输入文件中筛选值

样本输入

name    s1  s2  s3  s4
a1  7   8   7   8
a2  7   54  7   8
a3  8   8   8   8
a4  7   7   7   0
name    s3  s4
a1  7   8
a4  7   0
ids.1

name
a1
a4
ids.2

name
s3
s4
样本输出

name    s1  s2  s3  s4
a1  7   8   7   8
a2  7   54  7   8
a3  8   8   8   8
a4  7   7   7   0
name    s3  s4
a1  7   8
a4  7   0
我使用下面的代码过滤所选行的值。如何将其扩展到列

awk 'ARGIND == 1 { a[$1] = 1; next } a[$1] { print $0 }' ids.1 sample.input


name    s1      s2      s3      s4
a1      7       8       7       8
a4      7       7       7       0

这一条假设第一条记录始终在列文件(ids.2)中:

$awk'
ARGIND==1{#第一个文件,行
r[$1]
} 
ARGIND==2{#第二个文件,列
c[$1]
} 
ARGIND==3&&FNR==1{#第三个文件的第一条记录,数据
n=split($0,a)#将第一条记录拆分为列模板a
因为(我在a)#删除我们不想要的颜色
if((c中的a[i)==0)
删除[i]
}第三个文件和我们想要的行中的argid==3&&$1
b=”“#打印缓冲区

对于(i=1;i更简单、更快的版本:

awk '
ARGIND==1{row[$1]=1;next}
ARGIND==2{col[$1]=1;next}
row[$1]{
    for(i=1;i<=NF;i++){
        if(col[$i] && FNR==1) v[i]=1
        if (v[i]) printf "%s%s", (i==1?"":FS), $i
    }
    print ""
} ' id.1 id.2 data.file

谢谢,它更简单。但是,在具有100万行和1k列的数据矩阵上,标记为“答案”的脚本要快4分钟。:)