Awk 如何从选定的列和行中筛选值?
如何使用ids.1文件中的行名称和ids.2文件中的列名从输入文件中筛选值 样本输入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
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分钟。:)