<p>在每个Unix设备上的任何shell中使用任何awk,并且没有在每个记录中创建新字段(这是低效的,因为它会导致awk在每次更改字段时重新构建记录),也没有更新输入记录(这是低效的,因为它会导致awk在每次更改记录时将记录重新拆分为字段)并设计用于以任意顺序处理任意数量的值输入列:</p>
<pre><code>$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ printf "%s%s", $0, OFS }
NR==1 {
for (i=3; i<=NF; i++) {
printf "Total_%s%s", $i, OFS
tags[i] = $i
}
print "Percentage"
next
}
{
delete tot
for (i=3; i<=NF; i++) {
tag = tags[i]
n = split($i,vals,",")
for (j in vals) {
tot[tag] += vals[j]
}
printf "%s%s", tot[tag], OFS
}
printf "%0.3f%s", (tot["Weight"] ? tot["Height"] / tot["Weight"] : 0), ORS
}
</code></pre>
<p>
</p><pre><code>$ awk -f tst.awk file
Name type Age Weight Height Total_Age Total_Weight Total_Height Percentage
Xxx M 12,34,23 50,30,60,70 4,5,6,5.5 69 210 20.5 0.098
Yxx F 21,14,32 40,50,20,40 3,4,5,5.5 67 150 17.5 0.117
</code></pre>
<p>
</p><pre><code>$ awk -f tst.awk file | column -t
Name type Age Weight Height Total_Age Total_Weight Total_Height Percentage
Xxx M 12,34,23 50,30,60,70 4,5,6,5.5 69 210 20.5 0.098
Yxx F 21,14,32 40,50,20,40 3,4,5,5.5 67 150 17.5 0.117
</code></pre>
<p>为了展示上述方法的功能优势,假设您需要添加更多的值,如<code>ShoeSize</code>和/或重新排列列的顺序,例如:</p>
<pre><code>$ column -t file
Name type ShoeSize Height Age Weight
Xxx M 12,8,10 4,5,6,5.5 12,34,23 50,30,60,70
Yxx F 9,7,8 3,4,5,5.5 21,14,32 40,50,20,40
</code></pre>
<p>现在运行上述脚本,注意为每个原始列添加了<code>Total_</code>列,但仍然在末尾添加了相同的<code>Percentage</code>列的高度/重量:</p>
<pre><code>$ awk -f tst.awk file | column -t
Name type ShoeSize Height Age Weight Total_ShoeSize Total_Height Total_Age Total_Weight Percentage
Xxx M 12,8,10 4,5,6,5.5 12,34,23 50,30,60,70 30 20.5 69 210 0.098
Yxx F 9,7,8 3,4,5,5.5 21,14,32 40,50,20,40 24 17.5 67 150 0.117
</code></pre>