linux中使用awk根据多个列名提取指定列数据
首先需要准备一个只包含列名的文件name.list
和你要从中提取列的文件data.txt
name.list
a1
a2
a3
a4
data.txt
a0 a1 a2 a3 a4 a5 a6 b1 b2 b7 b8 b19
1 2 3 3 3 3 3 4 5 5 6 7
1 2 3 1 3 3 3 2 5 1 6 7
1 2 3 3 3 1 3 4 5 5 6 1
1 2 3 3 8 3 4 3 5 5 1 7
...
提取的文件,第一行为列名,与name.list对应,默认输出第一列(a0列)
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)}' name.list data.txt
不输出第一列(a0列)
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)}' name.list data.txt