我需要将文件的两列更改为科学记数法。 该文件看起来像
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.txt
或printf "%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
答案 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
有关详细信息,请参见手册页。