printf,打印值为科学记数法

时间:2017-05-27 12:29:34

标签: shell awk printf

我需要将文件的两列更改为科学记数法。 该文件看起来像

test.txt
10177   1   A   AC  0.376827    0.0116338   0.0316735   0.713391    0.422784    0.936182
10352   1   T   TA  0.43176 0.00523364  0.0307872   0.865015    0.427932    0.680802

我必须将第5列和第6列中的值更改为科学计数法 我知道printf "%1.3e", $5 test.txtprintf "%1.3e", $6 test.txt。 但是,这些命令在test.txt开头以科学记数法添加这些列的值。 如何将第5列和第6列的值更改为科学,并将它们保留在第5列和第6列中。感谢您提出任何建议。

期望结果看起来像

test.txt
10177   1   A   AC  3.768e-01   1.163e-02   0.0316735   0.713391    0.422784    0.936182
10352   1   T   TA  4.318e-01   5.234e-03   0.0307872   0.865015    0.427932    0.680802

我使用以下代码,这显然不正确:)

awk '{printf "%1.3e", $5}' test.txt > test1.txt
mv -f test1.txt test.txt

2 个答案:

答案 0 :(得分:1)

这样可以解决问题:

awk '{printf "%d %d %s %s %1.3e %1.3e %f %f %f %f\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10}' test.txt > test1.txt
mv -f test1.txt test.txt

根据需要更改列之间的空格/制表符。

答案 1 :(得分:0)

$ awk -v OFS='   ' '{for (i=1;i<=NF;i++) printf (i~/^[56]$/?"%1.3e":"%s")"%s", $i, (i<NF?OFS:ORS)}' file
10177   1   A   AC   3.768e-01   1.163e-02   0.0316735   0.713391   0.422784   0.936182
10352   1   T   TA   4.318e-01   5.234e-03   0.0307872   0.865015   0.427932   0.680802

使用GNU awk添加-i inplace以避免显式创建tmp文件(如果对您有意义):

$ cat file
10177   1   A   AC  0.376827    0.0116338   0.0316735   0.713391    0.422784    0.936182
10352   1   T   TA  0.43176 0.00523364  0.0307872   0.865015    0.427932    0.680802
$
$ awk -i inplace -v OFS='   ' '{for (i=1;i<=NF;i++) printf (i~/^[56]$/?"%1.3e":"%s")"%s", $i, (i<NF?OFS:ORS)}' file
$
$ cat file
10177   1   A   AC   3.768e-01   1.163e-02   0.0316735   0.713391   0.422784   0.936182
10352   1   T   TA   4.318e-01   5.234e-03   0.0307872   0.865015   0.427932   0.680802

有关详细信息,请参见手册页。