由于您在我的另一个答案中的一个 cmets 中写道,您有 20000 列,因此让我们考虑一种两步方法来简化调试以找出哪些步骤中断。
step1.awk
NR == 1 { PROCINFO["sorted_in"] = "@ind_num_asc"
for( i=1; i<=NF; i++ ) { f2c[$i] = (f2c[$i]=="")? "$" i : (f2c[$i] " $" i) } }
NR== 2 { for( fn in f2c) printf("%s:%s\n", fn,f2c[fn])
exit
}
Step1 应该给我们一个文件列表以及 它们的 列:
> awk -f step1.awk yourfile
Mpap_1:$1, $2, $3, $5, $13, $19, $25
Mpap_2:$4, $6, $8, $12, $14, $16, $20, $22, $26, $28
Mpap_3:$7, $9, $10, $11, $15, $17, $18, $21, $23, $24, $27, $29, $30
在我的测试数据中,Mpap_1 是第 1、2、3、5、13、19、25 列中的标题。让我们希望这第一步适用于您的大量列。 (坦率地说:我不知道 awk 是否可以处理 $20000。)
第 2 步:让我们创建一个著名的单衬里:
> awk -f step1.awk yourfile | awk -F : 'BEGIN {print "{"}; {print " print " $2, "> \"" $1 "\"" }; END { print "}" }' | awk -v "OFS=\t" -f - yourfile
第一部分是我们的第 1 步,第二部分即时构建第二个 awk 脚本,行如下:print $1, $2, $3, $5, $13, $19, $25 > "Mpap_1"。第二个 awk 脚本通过管道传送到第三部分,该部分从标准输入 (-f -) 读取脚本并将脚本应用于您的输入文件。
如果出现问题:观察 step2 的每个部分的输出,您可以执行从左到(但不包括)每个 | 符号的部分并查看发生了什么,例如:
-
awk -f step1.awk yourfile
awk -f step1.awk yourfile | awk -F : 'BEGIN {print "{"}; {print " print " $2, "> \"" $1 "\"" }; END { print "}" }'