awk 按照列名和顺序提取指定列数据最快方法
2022-09-17 本文已影响0人
吃吃吃_就知道吃
需要f1:
![](https://img.haomeiwen.com/i6552864/51570783a4d29516.png)
第一列为要提取的列名,其他列没有要求,tab分割
f2:
![](https://img.haomeiwen.com/i6552864/06b1ba105e8052a1.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
输出结果:
![](https://img.haomeiwen.com/i6552864/9ade15d4738eaff5.png)
此方法是根据列名顺序在读f2第一行时生成新的awk脚本,之后使用system调用,是最快的方法;输出命令瞅一眼
![](https://img.haomeiwen.com/i6552864/bca28ed60010ed0a.png)
之前的文章:https://www.jianshu.com/p/dafeb8b054c2
是在读f2每一行时都进行循环输出,是非常耗时的方法