需要f1:
image.png
第一列为要提取的列名,其他列没有要求,tab分割
f2:
image.png
需要提取的文件,第一行为列名,与f1对应,第一列默认输出;使用脚本:
awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[NR]=$1}NR>FNR&&FNR==1{tar="$1";for(i=1;i<length(a)+1;i++){for(j=1;j<NF+1;j++){if(a[i]==$j){tar=tar",$"j}}}cmd="awk '\''BEGIN{FS=OFS=\"\\t\"}{print "tar"}'\'' " ARGV[2];system(cmd)}' list1 data
下面的脚本默认不输出第一列
awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[NR]=$1}NR>FNR&&FNR==1{for(i=1;i<length(a)+1;i++){for(j=1;j<NF+1;j++){if(a[i]==$j){if(tar == ""){tar="$"j}else{tar=tar",$"j}}}}cmd="awk '\''BEGIN{FS=OFS=\"\\t\"}{print "tar"}'\'' " ARGV[2];system(cmd)}' list1 data
输出结果:
image.png
此方法是根据列名顺序在读f2第一行时生成新的awk脚本,之后使用system调用,是最快的方法;输出命令瞅一眼
image.png
之前的文章:https://www.jianshu.com/p/dafeb8b054c2
是在读f2每一行时都进行循环输出,是非常耗时的方法
网友评论