计算bash中列之间的百分比?

时间:2015-02-26 12:09:41

标签: bash shell awk

我有长标签格式的文件有很多列,我想计算两列之间的%(第3和第4),并打印此%与对应数字格式(%46.00)。

输入:

file1   323     434     45      767     254235  275     2345    467
file1   294     584     43      7457    254565  345     235445  4635
file1   224     524     4343    12457   2542165 345     124445  41257

期望的输出:

file1   323     434(134.37%)    45(13.93%)      767     254235  275     2345    467
file1   294     584(198.64%)    43(14.63%)      7457    254565  345     235445  4635
file1   224     524(233.93%)    4343(1938.84%)  12457   2542165 345     124445  41257

我试过了:

cat test_file.txt |  awk '{printf "%s (%.2f%)\n",$0,($4/$2)*100}' OFS="\t" | awk '{printf "%s (%.2f%)\n",$0,($3/$2)*100}' | awk '{print $1,$2,$3,$11,$4,$10,$5,$6,$7,$8,$9}' - | sed 's/ (/(/g' | sed 's/ /\t/g' >out.txt

它有效,但我想要对此进行分类。

1 个答案:

答案 0 :(得分:1)

我会说:

$ awk '{$3=sprintf("%d(%.2f%)", $3, ($3/$2)*100); $4=sprintf("%d(%.2f%)", $4, ($4/$2)*100)}1' file
file1 323 434(134.37%) 45(13.93%) 767 254235 275 2345 467
file1 294 584(198.64%) 43(14.63%) 7457 254565 345 235445 4635
file1 224 524(233.93%) 4343(1938.84%) 12457 2542165 345 124445 41257

具有避免重复的功能:

awk 'function print_nice (num1, num2) {
        return sprintf("%d(%.2f%)", num1, (num1/num2)*100)
     }
     {$3=print_nice($3,$2); $4=print_nice($4,$2)}1' file

这使用sprintf来表达特定格式并将其存储在变量中。计算是显而易见的。